Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 单态互斥_C++_Singleton_Circular Reference - Fatal编程技术网

C++ 单态互斥

C++ 单态互斥,c++,singleton,circular-reference,C++,Singleton,Circular Reference,我目前在我的一个项目(C++)中遇到了一个相互包含的问题 通常,如果我有一个相互包含的问题,我会通过向前声明或稍微重新设计类来轻松解决它。但这一次,我被困住了: 我有一个叫做Game的类,它创建并启动核心游戏系统,其中一个叫做GraphicsSystem。 在游戏构造函数中,动态创建GraphicsSystem对象并将其存储在GraphicsSystem*指针中。看起来像这样: Game::Game () { gfxSys = new GraphicsSystem(80, new Cam

我目前在我的一个项目(C++)中遇到了一个相互包含的问题

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

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

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();
}