我有两个类:
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/