0

我有两节课:

A类和B类

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

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

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

我的问题如下:

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

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

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

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

任何帮助将不胜感激。

4

1 回答 1

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
    };
  }
}    

乙:

#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
      }
    };
  }
}
于 2013-05-27T07:32:57.443 回答