两个相互引用的类

Posted

技术标签:

【中文标题】两个相互引用的类【英文标题】:Two classes that refer to each other 【发布时间】:2009-06-15 01:52:01 【问题描述】:

我是 C++ 新手,所以这个问题可能很基础:

我有两个类需要相互引用。每个都在自己的头文件中,#include 是另一个的头文件。当我尝试编译时,其中一个类出现错误“ISO C++ 禁止声明没有类型的‘Foo’”。如果我切换东西以便首先解析相反的标题,我会得到与其他类相同的错误。

在 C++ 中是否可以有两个需要相互引用的类?

更多细节:我有一个“App”类和一个“Window”类。 App需要参考Window来制作窗口。 Window有一个回调App的按钮,所以它需要一个App的引用。如果我不能让两个类相互引用,有没有更好的方法来实现这个?

【问题讨论】:

需要注意的是,尽可能避免相互依赖。将应用程序中按钮调用的功能分解为单独的控制器对象是否有意义? 我在小游戏中经常发现这个问题。我有一个 World 对象,其中包含需要引用 World 对象的 Game 对象,例如碰撞检测。还没有找到重构它的好方法。 (顺便说一句,唤醒一个 7 岁的讨论可以为我赢得某种徽章????) 【参考方案1】:

只要头文件中没有实现依赖项,就可以在头文件中使用前向声明来绕过循环依赖项。在 Window.h 中,添加这一行:

class App;

在 App.h 中,添加这一行:

class Window;

在类定义之前添加这些行。

然后在源文件中,包含实际类定义的标题。

如果您的类定义引用了其他类的成员(例如,内联),则需要将它们移动到源文件(不再内联)。

【讨论】:

我不能过分强调在 source 文件中包含带有实际定义的头文件而不是头文件的重要性。我已经有了前向声明,但在我读到这篇文章之前,我一直在遇到“重新定义错误”。真是个脑子放屁……不管怎样,谢谢! ^ 这个。这使我摆脱了所有这些循环依赖的麻烦。【参考方案2】:

前向声明是要走的路。

如果你在类头中使用指针\引用,那么两边的前向声明都对你有用。

如果您将对象创建为类成员,则必须包含标头本身。 (前向声明不起作用,因为编译器需要类定义才能知道大小)。

Refer C++ FAQ for solving such senario:

如果您将 Window 作为成员创建,则在 App 中包含 Window 标头,但同时 Window 不应包含 App 的标头。使用指向 App 的指针和那里的前向声明的组合。

【讨论】:

【参考方案3】:

您需要forward declaration。

【讨论】:

以上是关于两个相互引用的类的主要内容,如果未能解决你的问题,请参考以下文章

C++中两个类相互包含引用问题

使用哈希模板特化相互引用的两个类

相互引用的两个类

如何让两个模型相互引用 Django

使用实体框架,如何在两个模型上添加外键以相互引用

如何以完全相同的方式对两个列表(相互引用)进行排序