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

Posted

技术标签:

【中文标题】不同命名空间内的类的循环依赖 C++【英文标题】:Cyclic dependency for classes inside different namespaces C++ 【发布时间】:2013-05-27 06:45:16 【问题描述】:

我有两个班级:

A类和B类

A 类在命名空间 Common::subnamespace1 下声明

类 B 在命名空间 Common::subnamespace2 下声明

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

我的问题如下:

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

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

实际上我很困惑我必须以什么顺序使用包含。

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

任何帮助将不胜感激。

【问题讨论】:

根据你如何使用彼此内部的类,前向声明应该可以正常工作。如果您不向我们展示某种代码,我们真的无法为您提供更多帮助。 你能发布你的代码吗? @JoachimPileborg 好的。你能大致说出声明的顺序吗?我的意思是特别考虑命名空间。 没有一般规则。如果您的问题不能通过前向声明来解决,那么它比规范更复杂。在这种情况下,必须显示一些代码! @CodeRider:命名空间没有什么特别之处。根据经验,在头文件中只包含那些绝对必须编译的头文件,否则使用前向声明。 【参考方案1】: 如果您将该类用作基类或成员变量,或者如果您在头文件的内联函数中使用它(包括编译器生成的特殊成员),则必须将 #include 另一个类的定义添加到头文件中。 如果在函数声明中使用类作为函数参数或函数返回类型,或者如果使用指针或对它的引用作为成员,则只需要前向声明。 如果您使用以类作为参数实例化的模板,则取决于模板及其用途,是否需要类的定义。

对于您的情况,我假设 B 需要 A 的定义,但反之则不然。你的标题应该是这样的:

啊哈:

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
      
    ;
  

【讨论】:

以上是关于不同命名空间内的类的循环依赖 C++的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用类的命名空间定义类的成员

为啥我不能从不同命名空间中的朋友类更改类的私有成员?

C++命名空间

C++命名空间

深入理解Java虚拟机 类加载器的命名空间以及类的卸载

命名空间内的类定义