这是代码
#include <iostream>
#include "ClassA.h"
ClassA* class_a = new ClassA();
int main() {
return 0;
}
A类
#ifndef CLASSA_H
#define CLASSA_H
#include <iostream>
#include "ClassB.h"
class ClassA
{
public:
ClassA()
{
ClassB classB = new ClassB();
std::cout << "End of constructor" << std::endl;
}
void ClassA::DoSomething( void )
{
std::cout << "ClassA DoSomething";
}
};
#endif /* CLASSA_H */
B类
#ifndef CLASSB_H
#define CLASSB_H
class ClassA;
extern ClassA* class_a;
class ClassB
{
public:
ClassB ()
{
::class_a->DoSomething();
std::cout << "ClassB constructor" << std::endl;
}
};
#endif /* CLASSB_H */
在ClassB
的构造函数中,我在::class_a->DoSomething();
处遇到编译错误member access into incomplete type "ClassA"
。但是当它解析ClassB的构造函数时,ClassA是如何不完整的?当它通过ClassA时,是否会在它的构造函数中找到类型ClassB,然后希望转到该文件?
答案 0 :(得分:3)
这是一个不完整的类型,因为您没有在ClassA
标题中添加ClassB
的标题,但您尝试使用ClassA
实例。换句话说,由于前向声明,编译器知道有一个ClassA
,这足以声明一个指针,但是类型不完整而且无法使用,因为编译器没有看到类型的声明
您需要创建一个源文件(例如ClassB.cpp
),在源文件中包含ClassA
标头,并将ClassB
构造函数的实现移动到源文件。
答案 1 :(得分:0)
让我们从处理了包含的编译点开始看这个:
#line 1 main.cpp
//#include <iostream>
/* Text of iostream inserted here */
//#include "ClassA.h"
#line 1 ClassA.h
//#ifndef CLASSA_H (it isn't defined)
#define CLASSA_H
//#include <iostream>
/* Almost nothing here because iostream has already been included */
//#include "ClassB.h"
#line 1 ClassB.h
//#ifndef CLASSB_H (again, it isn't defined)
#define CLASSB_H
class ClassA;
extern ClassA* class_a;
class ClassB
{
public:
ClassB ()
{
::class_a->DoSomething();
右。所以我们编译了main.cpp,其中包括ClassA.h,其中包括ClassB.h。在我们到达此处时,ClassA
未定义。
将(至少)一个构造函数移动到一个单独的.cpp文件中。