美文网首页程序员
Xcode上关于include的小坑

Xcode上关于include的小坑

作者: smart_Alex | 来源:发表于2016-07-23 12:59 被阅读1607次

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

相关文章

网友评论

    本文标题:Xcode上关于include的小坑

    本文链接:https://www.haomeiwen.com/subject/koqwjttx.html