0

所以,我有一个问题:

A类需要了解B类,B类需要了解C,C类需要了解A。它本质上是一个圆圈,所以我得到定义错误。我尝试了前向声明,但无论顶部是什么,都不知道底部还有什么。

遇到这样的情况我该怎么办?

谢谢

大卫

4

5 回答 5

2

假设这很简单,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,它......我希望你明白这一点。但是使用指针,您可以循环它。使用组合(不是指针)它不能循环。

于 2012-04-10T03:47:51.147 回答
0

如果类是紧密耦合的,那么你可以这样做

  • 声明没有方法实现的类,可能使用前向声明,然后实现方法(可能在实现文件中)。

否则,您可以

  • 在不了解彼此的全部细节的情况下,分解出足以让类工作的更抽象的接口。

但很可能你有一个设计级别的错误,如果是这样,只需修复它。

于 2012-04-10T03:30:32.453 回答
0

您可以做的是在 C 类的头文件中前向声明 A 类,然后在 .cpp 文件中包含 A 类的头文件。

有关如何转发声明类 A 的参考,请查看此参考 - C++ 中的转发声明

于 2012-04-10T03:40:34.770 回答
0

最有可能的是,你刚刚遇到了设计级别的错误。

但是,如果你必须这样做,例如,只需尝试通过声明一个空类 A、B 来利用前向声明,而不在 C 的头文件中提供任何详细实现。然后当你需要使用它们时,在 C 的实现文件中包含 A 和 B 的头文件。

请记住,您只能在 C 类的声明中使用指针。

于 2012-04-10T03:44:30.633 回答
0

在您的头文件中使用下一个构造:

#ifndef MYCLASS_HPP__20120410__0747
#define MYCLASS_HPP__20120410__0747
// Your definions of class, struct, etc...
#endif//

并且所有包含的文件(self Myclass.hpp 除外)都应该在类头文件 Myclass.hpp 中。他必须包含在 Myclass.cpp 文件中。

于 2012-04-10T03:53:00.980 回答