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

Cyclic dependency for classes inside different namespaces C++

本文关键字:循环 依赖 命名空间 c++      更新时间:2023-10-16

我有两个类:

A类和B类

类A在命名空间Common::subnamespace1

下声明

类B在命名空间Common::subnamespace2

下声明

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

我的问题如下:

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

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

实际上,我很困惑我应该按照什么顺序使用包含物。

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

  • 如果你使用其他类作为基类或成员变量,或者如果你在头文件中的内联函数(包括编译器生成的特殊成员)中使用它,你必须将其他类的定义#include到头文件中。
  • 如果在函数声明中使用类作为函数参数或函数返回类型,或者使用指针或引用作为成员,则只需要向前声明。
  • 如果你使用模板实例化类作为参数,它取决于模板和它的用途,是否需要类的定义。

对于你的例子,我假设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
      }
    };
  }
}