所以,我有一个问题:
A类需要了解B类,B类需要了解C,C类需要了解A。它本质上是一个圆圈,所以我得到定义错误。我尝试了前向声明,但无论顶部是什么,都不知道底部还有什么。
遇到这样的情况我该怎么办?
谢谢
大卫
所以,我有一个问题:
A类需要了解B类,B类需要了解C,C类需要了解A。它本质上是一个圆圈,所以我得到定义错误。我尝试了前向声明,但无论顶部是什么,都不知道底部还有什么。
遇到这样的情况我该怎么办?
谢谢
大卫
假设这很简单,Adam Mihalcin 上面的评论是正确的,因为类似的问题回答了它。但无论如何我都会把它编码出来。
假设你有这个(方法定义无关紧要):
class A
{
B* ptrB;
}
class B
{
C* ptrC;
}
class C
{
A* ptrA;
}
然后,正如 Adam 所链接的那样,您可以像这样对所有 3 个进行 forward-delcare:
class A;
class B;
class C;
并将该块放在所有 3 个之上。但这里重要的是,这是当有指向其他类的指针时,而不是它们作为类的一部分的组合。您可以使用前向声明来允许在处理指针时正确编译,但不能在处理其他数据类型时正确编译。所以如果有这个:
class D
{
B myB;
}
在其他一切与上述相同的情况下,您需要将 B 的“真实”定义置于 D 的“真实”定义之上。但其余部分可能相同。前向声明仅对指针“有效”。
你必须在某个地方用一个指针打破你的依赖循环。如果从来没有指针,那么数据结构是“无限的”,因此不起作用。那是因为在我的示例中,D始终包含 B。但是如果 A 始终包含 B,B 始终包含 C,C 始终包含 A,该怎么办?好吧,最后的 A 需要另一个 B,它需要另一个 C,它......我希望你明白这一点。但是使用指针,您可以循环它。使用组合(不是指针)它不能循环。
如果类是紧密耦合的,那么你可以这样做
否则,您可以
但很可能你有一个设计级别的错误,如果是这样,只需修复它。
您可以做的是在 C 类的头文件中前向声明 A 类,然后在 .cpp 文件中包含 A 类的头文件。
有关如何转发声明类 A 的参考,请查看此参考 - C++ 中的转发声明
最有可能的是,你刚刚遇到了设计级别的错误。
但是,如果你必须这样做,例如,只需尝试通过声明一个空类 A、B 来利用前向声明,而不在 C 的头文件中提供任何详细实现。然后当你需要使用它们时,在 C 的实现文件中包含 A 和 B 的头文件。
请记住,您只能在 C 类的声明中使用指针。
在您的头文件中使用下一个构造:
#ifndef MYCLASS_HPP__20120410__0747
#define MYCLASS_HPP__20120410__0747
// Your definions of class, struct, etc...
#endif//
并且所有包含的文件(self Myclass.hpp 除外)都应该在类头文件 Myclass.hpp 中。他必须包含在 Myclass.cpp 文件中。