C++ 单态互斥
我目前在我的一个项目(C++)中遇到了一个相互包含的问题 通常,如果我有一个相互包含的问题,我会通过向前声明或稍微重新设计类来轻松解决它。但这一次,我被困住了: 我有一个叫做Game的类,它创建并启动核心游戏系统,其中一个叫做GraphicsSystem。 在游戏构造函数中,动态创建GraphicsSystem对象并将其存储在GraphicsSystem*指针中。看起来像这样:C++ 单态互斥,c++,singleton,circular-reference,C++,Singleton,Circular Reference,我目前在我的一个项目(C++)中遇到了一个相互包含的问题 通常,如果我有一个相互包含的问题,我会通过向前声明或稍微重新设计类来轻松解决它。但这一次,我被困住了: 我有一个叫做Game的类,它创建并启动核心游戏系统,其中一个叫做GraphicsSystem。 在游戏构造函数中,动态创建GraphicsSystem对象并将其存储在GraphicsSystem*指针中。看起来像这样: Game::Game () { gfxSys = new GraphicsSystem(80, new Cam
Game::Game ()
{
gfxSys = new GraphicsSystem(80, new Camera());
}
现在,我的GraphicsSystem类需要在某一点访问游戏类的方法,以获取存储在游戏对象中的player对象。各自的部分如下所示(顺便说一句,游戏是单身!):
现在我已经尝试在两个方向上向前声明了,但这不能满足编译器的要求。我当然也可以把玩家的指针放进图形系统,但我真的不想这么做,因为他不属于那里
有没有什么方法可以解决这个问题而不用我对设计做太多的修改?我现在真的很难办,所以我希望你们能帮我
我正在使用VisualStudio2010(Visual C++)
提前谢谢你!
克里斯 < P>在C++中有两种主要的方法来打破循环依赖性。 1) 创建一个“接口”类,该类列出实类实现的方法以及实类继承的方法。然后可以包含它,而不是真正类的声明
2) Pimpl-一个类持有一个指向其真实数据的不透明指针,解决了必须包含成员变量类型声明的问题。我知道这听起来很诡异,但您是否考虑过持有初始化的
游戏
类的全局引用
我知道globals是邪恶的等等,我相信很多人都会愤怒,但根据我个人的经验,我已经屈从于游戏类的单音症,并且发现有时候这根本不必要
你需要问自己的最大问题是“您试图保护您的游戏对象不受谁的伤害?您是否有任何理由每次需要游戏类时都需要请求一个实例?我很确定,如果你的游戏对象没有初始化,你就不会在你的引擎里做很多其他的事情
希望这能帮助你以不同的方式思考问题,即使它不能直接回答你的问题。在Game.h中向前声明图形系统。如果需要,在GraphicsSystem.h中包含Game.h。在Game.cpp中包括Game.h和GraphicsSystem.h。在GraphicsSystem.cpp中包括Game.h和GraphicsSystem.h。
根据您发布的代码,这应该是可行的。您能否提供一些有关尝试转发声明时发生的情况的详细信息?还有,代码文件的结构是什么?我的意思是相关的类在哪些文件中?谢谢,我现在直接在游戏中包含GraphicsSystem.h。cpp修复了它。通常,除了相应的类声明文件外,我从不在.cpp中包含其他头文件(这意味着在Game.cpp中只包含Game.h)。使用转发声明时,我是否应该只在.cpp中包含?@Christoph如果必须在类的实现中使用不匹配的类(本例中为GraphicsSystem类),则需要包含头文件,无论是否使用转发声明,但在执行转发声明时,您几乎总是需要包含另一个头文件。
void GraphicsSystem::handleFrame ()
{
ElementList elements = Game::instance()->getPlayer()->getEnvironment()->getElements();
}