VC++ error C2079:

2024-12-26 23:17:59
推荐回答(3个)
回答1:

超前引用问题---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;
};

然后就可以了。

那么,直接给出一条重要的结论:
超前引用不可使用类名来定义变量和函数的变量参数,只可用来定义引用或者指针。

要解释其实是很简单的,因为编译器在处理类的时候,要为他的成员分配空间。

回答2:

你再fun函数里定义静态变量,还无限次调用,会不会每次调用都声请一个静态变量?
建议在函数外声请静态变量。

回答3:

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"即可。