与单身人士相互包容

时间:2012-08-09 00:19:23

标签: c++ singleton circular-reference

我目前在我的项目(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 ++)。

提前谢谢! 克里斯

3 个答案:

答案 0 :(得分:1)

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

1)创建一个“接口”类,列出真实类实现的方法以及真正的类继承的方法。然后你可以包括那而不是真实类的声明。

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

答案 1 :(得分:1)

在Game.h中转发声明GraphicsSystem。如果需要,请在GraphicsSystem.h中包含Game.h。在Game.cpp中包含Game.h和GraphicsSystem.h。在GraphicsSystem.cpp中包含Game.h和GraphicsSystem.h。 这应该基于你发布的代码。

答案 2 :(得分:0)

我知道这听起来很狡猾,但您是否考虑过将global reference保留在已初始化的Game课程中?

我知道全局变形是邪恶的等等,我相信很多人都会愤怒,但以我个人的经验我屈服于 Singletonitis 使用Game类(以及其他类)并发现有时它只是没有必要。

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

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