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

标签 c++ class namespaces

我有两个类:

A类和B类

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

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

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

我的问题如下:

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

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

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

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

我们将不胜感激。

最佳答案

  • 如果您将该类用作基类或成员变量,或者如果您在 header 中的内联函数中使用它(包括编译器),则必须将其他类的定义#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++ 中类的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16767690/

相关文章:

c++ - 打印包含指定子字符串的所有字符串

c++ - 如何向 visual studio 2015 添加多个属性表?

excel - 控件的 VBA 集合(数组?)

c++ - 在类语法帮助中比较对象;

C# 不同文件中的相同命名空间

xslt - Saxon Transformerfactory 放置不需要的 xmlns :xsd ="http://www.w3.org/2001/XMLSchema" in transformer output

python - 装饰器参数中无法识别的类

c++ - __typeof - 未找到标识符

c++ - 基本 C++ 练习(命令提示符不显示任何 cout。没有编译器错误)

java - 编译时出现错误 : class, 接口(interface)或预期枚举