读书人

c++前向宣言不管用

发布时间: 2013-10-13 14:03:53 作者: rapoo

c++前向声明不管用
class ArcIter
VexNode::~VexNode()
{
ArcIter iter(this->firstInArc);
while(!iter.isEnd)
{
ArcNode* ptemp=iter.pArcNode;
iter.nextComDes();
delete ptemp;
}

//ArcIter iter(firstOutArc);

}

错误如下

1>..\source\JunkSmsSender.cpp(48) : error C2079: 'iter' uses undefined class 'ArcIter'(我已经前向声明了ArcIter这个类,怎么还这样?)
1>..\source\JunkSmsSender.cpp(48) : error C2440: 'initializing' : cannot convert from 'ArcNode *' to 'int'
1> There is no context in which this conversion is possible
1>..\source\JunkSmsSender.cpp(49) : error C2228: left of '.isEnd' must have class/struct/union




class ArcNode
{
friend class AdjList;
friend class ArcIter;
friend class JunkSmsFilter;
public:
ArcNode();
ArcNode(VEXID mdest,VEXID msrc);
private:
VEXID dest; // 标示弧指向的那个顶点,比邻接表多出一个顶点
VEXID src; // 标示弧指向的那个顶点,比邻接表多出一个顶点
int weight; // 有多少个边
ArcNode* nextArc_comSrc;//十字链表的横向链接出度边
ArcNode* nextArc_comDes;//十字链表的纵向链接出度边
};
ArcNode::ArcNode()
{

nextArc_comSrc=NULL;
nextArc_comDes=NULL;
}
ArcNode::ArcNode(VEXID msrc,VEXID mdest)
{
dest=mdest;
src=msrc;
weight=1;
nextArc_comSrc=NULL;
nextArc_comDes=NULL;
}


class ArcIter
{
public:

ArcIter(ArcNode*);
ArcNode* nextComDes();
ArcNode* nextComSrc();
bool isEnd();
private:
ArcNode* pArcNode;

};
ArcIter::ArcIter(ArcNode* piter)
{
pArcNode=piter;
}
ArcNode* ArcIter::nextComDes()
{
pArcNode=pArcNode->nextArc_comDes;
return pArcNode;
}
ArcNode* ArcIter::nextComSrc()
{
pArcNode=pArcNode->nextArc_comSrc;
return pArcNode;
}
bool ArcIter::isEnd()
{
if(pArcNode==NULL) return true;
return false;
}

[解决办法]
前向声明只管能声明类型的指针(不完全类型),其他的都不管用(比如访问类型成员)。

[解决办法]

引用:
前向声明只管能声明类型的指针(不完全类型),其他的都不管用(比如访问类型成员)。

+1

另外 引用也可以前置声明
[解决办法]
class ArcIter,请在你用到的地方#inlude 该头文件即可!
[解决办法]
在头文件才可能使用向前声明,源文件怎么可能使用向前声明的。在源文件里面,你要用到向前声明的那个类的一些函数,你使用函数,你就得告诉编译器,你的这个类是怎么定义的。
在头文件,你可能并不需要用到这个类的内部东西,这时你才可以向前声明。

读书人网 >C++

热点推荐