tur*_*oom 1 c++ include identifier
我把自己投入学习C++的冷风暴中.我已经知道Java,但C++在某些方面似乎很奇怪.
事情就是这样:我有一个A类和一个B类.A类本身就有一个B类实例.B类需要能够调用一些A类方法,因此,我在B类的构造函数中放置了一个指向A类的指针,并将其存储在一个变量中,这样我就可以用这个变量检索这些方法.
这是我的代码(简化):
#ifndef CLASSA
#define CLASSA
#include "ParentClass.h"
#include "ClassB.h"
class ClassA : public ParentClass {
private:
ClassB *classB;
public:
ClassA(void);
virtual ~ClassA(void);
};
#endif
Run Code Online (Sandbox Code Playgroud)
#include "ClassA.h"
//-----------------------------------------------------
ClassA::ClassA(void){
classB= new ClassB(this);
}
//-----------------------------------------------------
ClassA::~ClassA(void)
{
}
//-----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
#ifndef CLASSB
#define CLASSB
#include "ClassA.h"
class ClassB{
public:
ClassB(ClassA &pClassA){ classA = pClassA; };
ClassA *getClassAInstance(){ return classA; };
private:
ClassA *classA;
};
#endif
Run Code Online (Sandbox Code Playgroud)
#include "ClassA.h"
/*ClassB::ClassB(void){
classA= pClassA;
}*/
Run Code Online (Sandbox Code Playgroud)
Visual Express不会出错,但是当我编译时,它说B类不能识别什么是A类.到底是什么?
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(8):错误C2061:语法错误:标识符'ClassA'
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(10):错误C2143:语法错误:缺少';' 在'*'之前
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(10):错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(10):错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(10):警告C4183:'getClassAInstance':缺少返回类型; 假设是一个返回'int'的成员函数
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(13):错误C2143:语法错误:缺少';' 在'*'之前
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(13):错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(13):错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(8):错误C2065:'classA':未声明的标识符
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(8):错误C2065:'pClassA':未声明的标识符
1> c:\ xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\ClassB.h(10):错误C2065:'classA':未声明的标识符
未申报的是什么?返回int?
未声明的标识符
为什么?我包括了一切,对吗?伙计们有什么不妥的想法吗?
这是因为头文件之间存在循环引用.你可以通过向前声明另一个标题中的一个类来打破它,如下所示:
#ifndef CLASSA
#define CLASSA
#include "ParentClass.h"
//#include "ClassB.h" <<<<< Circular reference is now broken
class ClassB; // Added a forward declaration for use below.
class ClassA : public ParentClass {
private:
ClassB *classB;
public:
ClassA(void);
virtual ~ClassA(void);
};
#endif
Run Code Online (Sandbox Code Playgroud)