未声明的标识符编译错误

tur*_*oom 1 c++ include identifier

我把自己投入学习C++的冷风暴中.我已经知道Java,但C++在某些方面似乎很奇怪.

事情就是这样:我有一个A类和一个B类.A类本身就有一个B类实例.B类需要能够调用一些A类方法,因此,我在B类的构造函数中放置了一个指向A类的指针,并将其存储在一个变量中,这样我就可以用这个变量检索这些方法.

这是我的代码(简化):

ClassA.h

#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)

ClassA.cpp

   #include "ClassA.h"

   //-----------------------------------------------------
   ClassA::ClassA(void){
    classB= new ClassB(this);
   }
   //-----------------------------------------------------
   ClassA::~ClassA(void)
   {
   }
   //-----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

ClassB.h

#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)

ClassB.cpp

#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?

未声明的标识符

为什么?我包括了一切,对吗?伙计们有什么不妥的想法吗?

das*_*ght 5

这是因为头文件之间存在循环引用.你可以通过向前声明另一个标题中的一个类来打破它,如下所示:

#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)