超前引用问题---error C2079: '' uses undefined class
比如说,我们先定义一个b类再定义一个a类,a的一个成员就是b,如下:
class b{
int i;
};
class a {
b val ;
};
这显然是可以的。
如果这个时候,要把b的定义放到后面去,大家都知道在前面先声明b,那么:
class b;
class a {
b val ;
};
class b{
int i;
};
通过不了编译的。那么再改,把val换成对b的指针,这样:
class b;
class a {
b * val ;
};
class b{
int i;
};
然后就可以了。
那么,直接给出一条重要的结论:
超前引用不可使用类名来定义变量和函数的变量参数,只可用来定义引用或者指针。
要解释其实是很简单的,因为编译器在处理类的时候,要为他的成员分配空间。
你再fun函数里定义静态变量,还无限次调用,会不会每次调用都声请一个静态变量?
建议在函数外声请静态变量。
C++编译器要求,在声明一个类的一个实例前,必须知道这个类的定义。也就是说,当编译到A a;这样的语句的时候,必须知道A的定义,因为这样编译器才能够决定给a分配多少内存空间。如果你仅仅是声明A *a的话,则编译器不需要知道A的定义,因为编译器只需要给a分配4字节的空间用来存放地址即可。
因为上述原因,建议你将Class A{/*类定义*/};放到void fun()的前面。当然,最好的方法是对A类,创建2个文件,分别是A.h和A.cpp。A.h一个存放定义,用于被别的文件#include,而A.cpp则存放A的实现。例如:
A.h:
class A
{
public:
void DoSomething();
private:
int m_value;
};
A.cpp:
#include "A.h"
void A::DoSomething()
{
//...
}
将A.h和A.cpp加入你的工程后,只需要在你的代码:void fun(){之前,将class A;这一句替换成
#include "A.h"即可。