程序员

Xcode上关于include的小坑

2016-07-23  本文已影响1607人  smart_Alex

我们在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.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"
/*...*/

上一篇 下一篇

猜你喜欢

热点阅读