不同命名空间C ++中的类的循环依赖

时间:2013-05-27 06:45:17

标签: c++ class namespaces

我有两个班级:

A类和B类

A类在名称空间Common :: subnamespace1

下声明

B类在名称空间Common :: subnamespace2

下声明

A类和B类都在名称空间Common下,但在不同的子名称空间下。

我的问题如下:

在B类头文件中包含A类是可以的 但是在A类中包含B类标题并在其中声明类型B的成员会导致 编译错误未定义类型'B'。

我尝试过使用前向声明来避免循环依赖。但仍然存在错误。

实际上我很困惑我必须使用内含物的顺序。

注意:我没有发布代码,因为我只是想知道相互声明或包含类的确切顺序或方法。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

  • 如果您将该类用作基类或成员变量,或者在标题中的内联函数中使用它(包括编译器生成的特殊成员),则必须将#include另一个类'定义放入标题中。
  • 如果在函数声明中使用类作为函数参数或函数返回类型,或者使用poitners或对它的引用作为成员,则只需要一个前向声明。
  • 如果您使用以类作为参数实例化的模板,它取决于模板及其使用,是否需要类的定义。

对于你的情况,我假设B需要A的定义,而不是相反。您的标题应如下所示:

A.H:

namespace Common {
  namespace subnamespace2 {
    class B;
  }

  namespace subnamespace1 {
    class A {
      void foo(subnamespace2::B& b);   //reference, parameter -> fwd-decl
      subnamespace2::B* pB;            //pointer -> fwd-decl
    };
  }
}    

B.h:

#include "A.h"
namespace Common {

  namespace subnamespace2 {
    class B {
      subnamespace1::A a; //direct member -> def needed
      void bar() {
        a.foo(*this);  //inline use -> def needed
      }
    };
  }
}