1

我目前在我的项目(C++)中相互包含有问题。

通常,如果我有一个相互包含的问题,我会很容易地通过前向声明或重新设计类来解决它。但这一次,我被困住了:

我有一个名为Game的类,它创建和启动核心游戏系统,其中一个称为GraphicsSystem。在 Game 构造函数中,GraphicsSystem 对象被动态创建并存储在 GraphicsSystem* 指针中。看起来像这样:

Game::Game ()
{
    gfxSys = new GraphicsSystem(80, new Camera());
}

现在我的 GraphicsSystem 类需要在某一时刻访问 Game 类的方法来获取存储在 Game 对象中的玩家对象。各自的部分看起来像这样(游戏是单例!):

void GraphicsSystem::handleFrame ()
{
    ElementList elements = Game::instance()->getPlayer()->getEnvironment()->getElements();
}

现在我已经尝试在两个方向上进行前向声明,但这不能满足编译器的要求。我当然也可以将玩家指针放入图形系统,但我真的不想这样做,因为他不属于那里。

有没有什么办法可以解决这个问题,而我不必过多地改变设计?我现在真的很困惑,所以我希望你们能帮助我。

我正在使用 Visual Studio 2010 (Visual C++)。

先感谢您!克里斯

4

3 回答 3

1

有两种主要方法可以打破 C++ 中的循环依赖关系。

1)创建一个“接口”类,其中列出了您的真实类实现的方法以及您的真实类继承自的方法。然后你可以包含它而不是真实类的声明。

2) Pimpl - 一个类拥有一个指向其真实数据的不透明指针,解决了必须包含成员变量类型声明的问题。

于 2012-08-09T00:23:35.013 回答
1

在 Game.h 中前向声明 GraphicsSystem。如果需要,请在 GraphicsSystem.h 中包含 Game.h。在 Game.cpp 中包含 Game.h 和 GraphicsSystem.h。在 GraphicsSystem.cpp 中包含 Game.h 和 GraphicsSystem.h。这应该根据您发布的代码起作用。

于 2012-08-09T00:25:45.167 回答
0

我知道这听起来很狡猾,但是您是否考虑过global reference对已初始化的Game课程持有 a ?

我知道全局变量是邪恶的等等,我敢肯定很多人会愤怒,但根据我个人的经验,我已经屈服于类(以及其他)的SingletonitisGame并且发现有时它只是简单地没必要。

您需要问自己的最大问题是“您要保护您的 Game 对象免受谁的侵害?您是否有任何理由在每次需要游戏类时都需要请求一个实例?我很确定如果您的Game对象没有初始化,无论如何你不会在你的引擎中做很多其他事情。

希望这可以帮助您以不同的方式思考问题,即使它没有直接回答您的问题。

于 2012-08-09T00:25:36.103 回答