【问题标题】:Cyclic dependency for classes inside different namespaces C++不同命名空间内的类的循环依赖 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:命名空间没有什么特别之处。根据经验,在头文件中只包含那些绝对必须编译的头文件,否则使用前向声明。

标签: c++ class namespaces


【解决方案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
      }
    };
  }
}

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多