C ++实例跨多个文件访问彼此

时间:2018-04-14 10:50:15

标签: c++ global-variables extern

简而言之,我的问题是:

  

如何在没有循环链接的情况下让两个类实例相互访问?

到目前为止,根据以下回答,我的解决方案是:

不是将.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.hgraphics.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
...

这也最终成为循环包含。

如何能够使两个或更多个差异类的实例能够访问彼此的功能?

1 个答案:

答案 0 :(得分:0)

信用转到Bo PerssonKenny 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。不管这是不是好的做法,我还在研究。