不同命名空间内的类的循环依赖 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++的主要内容,如果未能解决你的问题,请参考以下文章