【发布时间】:2016-06-07 22:16:56
【问题描述】:
这里是代码
#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"。但是ClassA在解析ClassB的构造函数时怎么不完整呢?当它通过 ClassA 时,它是否会在其构造函数中到达 ClassB 类型,然后希望转到该文件?
【问题讨论】:
-
编译器并没有试图欺骗你。
ClassA在解析class_a->DoSomething();行时确实没有定义。尝试将 .h 文件的内容放在一个 .cc 文件中,然后检查 .cc 文件的内容。 -
这很明显。
B中A的定义在哪里?您只有一个前向声明,因此除了存储引用(指针或引用)之外,您不能做任何事情。
标签: c++ incomplete-type