所以,我遇到了一个问题:
A类需要了解B类,B类需要了解C,而C类需要了解A. 它本质上是一个圆圈,所以我得到了定义错误。我试着向前宣布,但无论如何,都不知道底部还有什么。
我怎么会这样的情况?
由于
大卫
答案 0 :(得分:2)
假设这很简单,Adam Mihalcin上面的评论是正确的,因为类似的问题可以回答它。但无论如何我都会编码。
假设你有这个(方法定义无关紧要):
class A
{
B* ptrB;
}
class B
{
C* ptrC;
}
class C
{
A* ptrA;
}
然后你可以像亚当一样,直接向他们展示三个人:
class A;
class B;
class C;
将该区块放在其中3个区块之上。这里重要的是,这是当其他类有指针时,而不是它们是类的一部分的组合。您可以使用forward-declaration来处理指针时正确编译,但不能与其他数据类型一起编译。所以如果有的话:
class D
{
B myB;
}
如果其他一切与上面相同,那么你需要在D的“真实”定义之上具有B的“真实”定义。但其余的可能是相同的。前向声明仅适用于指针。
你必须用指针打破你的依赖循环。如果从来没有指针,那么数据结构是“无限的”,因此不起作用。那是因为在我的例子中,D 总是包含一个B.但是如果一个A总是包含一个B,而一个B总是包含一个C,那么一个C总是包含一个A?好吧,最后的A需要另一个B,这需要另一个C,...我希望你能得到这个想法。但是使用指针,你可以循环它。使用合成(而不是指针)它无法循环。
答案 1 :(得分:0)
如果类紧密耦合,则可以使用
否则,您可以
但很可能你有一个设计级别的错误,如果有的话,只需修复它。
答案 2 :(得分:0)
你可以做的是在C类的头文件中转发声明类A,然后你在.cpp文件中包含A类的标题。
有关如何转发声明A类的参考,请参阅此参考 - Forward declarations in C++
答案 3 :(得分:0)
但是,如果必须这样做,例如,只需尝试通过声明空类A,B来利用前向声明,而不在C的头文件中显示任何详细实现。然后在需要使用它们时在C的实现文件中包含A和B的标题。
请记住,你只能在C类声明中使用指针。
答案 4 :(得分:0)
在头文件中使用下一个构造:
#ifndef MYCLASS_HPP__20120410__0747
#define MYCLASS_HPP__20120410__0747
// Your definions of class, struct, etc...
#endif//
所有包含的文件(自我Myclass.hpp除外)都应该在类头文件Myclass.hpp中。他必须包含在Myclass.cpp文件中。