我们在Xcode写代码的时候,有时会出现这样一种情况
class demo_A{
demo_B* p;
}
class demo_B{
function_b(demo_A);
}
如果我们的头文件和声明不正确的话,Xcode就会报错(vs上没试过,感觉应该是一样的)
Member access into incomplete type " "
(只对解决方案感兴趣的请直接拉到底)
很多同学可能会这样写
//demo_A.h
#include "demo_B.h"
class demo_A{
demo_B* p; //(报错)
demo_A(demo_A& t) { p = t.p } //copy constructor
}
//demo_B.h
#include "demo_A.h"
class demo_B { /*...*/}
我们一般会将比较简短的代码放在声明之后,这样简洁一点,但这样就会出错,因为,编译器这时候不知道你的demo_B的定义;
这时候,会报错
Unknown type name 'demo_B'
然后,我们可能会这样操作
//demo_A.h
#include "demo_B.h"
class demo_B; //new sentence
class demo_A{
demo_B* p;
demo_A(demo_A& t) { p = t.p } //copy constructor (报错)
}
//demo_B.h
#include "demo_A.h"
class demo_B { /*...*/}
在A的头文件中加一条B的声明。这时候,就会报我们一开始提到的错
Member access into incomplete type "demo_B"
这时候,我们就有点困惑了,demo_B明明是完整的,定义好的,我也包含了头文件,还声明了一下。怎么还有错。
原因:你的两个头文件互相包含。
解决方案:
- 在demo_A头文件中不要包含demo_B的头文件,这一步放在cpp文件中进行;
- 在demo_A头文件中只做声明,不做定义。例如在demo_A中用到demo_B,那么我就写一个demo_B的声明,而不是include demo_B的头文件。并且所有用到demo_B的member function都不在头文件中定义。
示例
//demo_A.h
class demo_B;
class demo_A{
demo_B* p;
demo_A(const demo_A& ); //copy constructor
}
//demo_A.cpp
#include"demo_A.h"
#include"demo_B.h"
demo_A::demo_A(const demo_A& t){
p = t.p;
}
//demo_B.h
#include "demo_A.h"
class demo_B { /*...*/}
//demo_B.cpp
#include "demo_B.h"
/*...*/
网友评论