简而言之,我的问题是:
如何在没有循环链接的情况下让两个类实例相互访问?
到目前为止,根据以下回答,我的解决方案是:
不是将.h
个文件包含在其他.h
文件中并导致循环链接,而是将它们移至.cpp
个文件。
con_instance.h
#ifndef CON_INSTANCE_H
#define CON_INSTANCE_H
#include "controller.h"
extern controller con;
#endif // CON_INSTANCE_H
gfx_instance.h
#ifndef GFX_INSTANCE_H
#define GFX_INSTANCE_H
#include "graphics.h"
extern graphics gfx;
#endif // GFX_INSTANCE_H
controller.cpp
#include controller.h
#include gfx_instance.h
...
graphics.cpp
#include graphics.h
#include con_instance.h
...
的main.cpp
#include global.h
...
#include con_instance.h
#include gfx_instance.h
controller con;
graphics gfx;
main() {
...
}
现在,两个实例都可以安全地相互访问。
gfx
现在可以con.GetSomeObj()
,con
可以gfx.obj.GetPos();
每当您需要创建另一个类时,您需要访问其他类,只需重复创建实例标头的过程,将其包含在其他.cpp
文件和main.cpp
中,然后实例化它在main.cpp
。不管这是不是好的做法,我还在研究。
您可以放心地忽略此行以下的所有内容。 (我现在该怎么办?问题太长了,我想我需要擦掉一些东西。)
<小时/> 我已经完成了我的尽职调查并在数据库中搜索了我的问题,但我觉得我的问题没有得到充分的回答。
global.h
#include constants.h
#include tools.h
#include enums.h
...
或者Controller.h
#include global.h
...
graphics.h中
#include global.h
...
的main.cpp
#include global.h
#include graphics.h
#include controller.h
graphics gfx;
controller con;
while(in_game) {
con.CheckInput();
con.DoLoop();
gfx.DrawAll();
}
我拥有所有项目都需要能够访问的所有库和工具。因此,每个主要类都包含global.h
,以便访问项目范围的变量,常量等。
我的问题是,我无法gfx
访问con
,反之亦然。这两个属于同一级别,我需要它们能够互相访问。
例如,我有控制器.cpp
将加载插件,这些插件有图形。我需要gfx
才能访问con
并绘制需要绘制的内容。它需要能够为插件加载的任何图形调用绘图函数,例如con.DrawPlugins();
另一方面,控制器的主要用途之一是更改某些图形对象的变量。它需要能够访问gfx.tex.SetPos();
或gfx.menu.GetPos();
我尝试过这样的事情:
global.h
...
#include graphics.h
#include controller.h
extern graphics gfx;
extern controller con;
但是这两个文件包含在与他们还需要访问的内容相同的级别,并且它们正在进行循环包含。
因此,我尝试将上述代码移至global_objects.h
,只需让controller.h
和graphics.h
文件包含它即可。这也行不通。
我试过了:
con_instance.h
#include controller.h
extern controller con;
gfx_instance.h
#include graphics.h
extern graphics gfx;
的main.cpp
...
#include gfx_instance.h
#include con_instance.h
graphics gfx;
controller con;
...
main() { ... }
graphics.h中
...
#include con_instance.h
...
或者Controller.h
...
#include gfx_instance.h
...
这也最终成为循环包含。
如何能够使两个或更多个差异类的实例能够访问彼此的功能?
答案 0 :(得分:0)
信用转到Bo Persson和Kenny Ostrom,以便在评论中向我指出。我愿意接受任何一个答案,但是我只是发布自己的答案,将其标记为已关闭。
简而言之,我的问题是:
如何在没有循环链接的情况下让两个类实例相互访问?
根据下面的回答,我的解决方案是我的问题:
不是将.h
个文件包含在其他.h
文件中并导致循环链接,而是将它们移至.cpp
个文件。
con_instance.h
#ifndef CON_INSTANCE_H
#define CON_INSTANCE_H
#include "controller.h"
extern controller con;
#endif // CON_INSTANCE_H
gfx_instance.h
#ifndef GFX_INSTANCE_H
#define GFX_INSTANCE_H
#include "graphics.h"
extern graphics gfx;
#endif // GFX_INSTANCE_H
controller.cpp
#include controller.h
#include gfx_instance.h
...
graphics.cpp
#include graphics.h
#include con_instance.h
...
的main.cpp
#include global.h
...
#include con_instance.h
#include gfx_instance.h
controller con;
graphics gfx;
main() {
...
}
现在,两个实例都可以安全地相互访问。
gfx
现在可以con.GetSomeObj()
,而con可以gfx.obj.GetPos();
每当您需要创建另一个类时,您需要访问其他类,只需重复创建实例标头的过程,将其包含在其他.cpp
文件和main.cpp
中,然后实例化它在main.cpp
。不管这是不是好的做法,我还在研究。