我对课程有点问题。 以下是我的一些代码:
//GameMap.h
#ifndef GAMEMAP_H
#define GAMEMAP_H
#include "apath.h"
class GameMap
{
/*class definition here*/
};
#endif
和
//apath.h
#ifndef APATH_H
#define APATH_H
class path
{
//some code...
void DoSomething(GameMap map);
//rest of class body
};
#endif
我无法在apath.h中使用GameMap,当我尝试在此文件中包含“GameMap.h时,我得到了一些愚蠢的错误......我还尝试添加类GameMap;在定义路径类之前。没有任何帮助..我真的需要在这里使用它...... 如果需要,我可以发布更多代码。
Thanx任何回复!
答案 0 :(得分:4)
您应该在apath.h中使用类GameMap
的前向声明:
class GameMap; // forward declaration
class path
{
//some code...
void DoSomething(GameMap map);
//rest of class body
};
检查:When can I use a forward declaration?
在下面的示例中,我使用了类A
的前向声明,以便我能够声明使用它的函数useA
:
// file a.h
class A;
void useA(A a);
然后在main.cpp中我有:
#include "a.h"
class A
{
public:
void foo() { cout << "A"; }
};
void useA(A a)
{
a.foo();
}
这是绝对正确的,因为这里已经定义了A类。
希望这有帮助。
答案 1 :(得分:2)
你应该检查PIMPL成语。
在路径标题中:
class GameMap;
class Path
{
public:
void useMap( GameMap * map );
};
在路径来源:
#include "Path.h"
#include "GameMap.h"
void Path::useMap( GameMap * map )
{
// Use map class
}
更多链接:link和connected topic。
答案 2 :(得分:1)
在apath.h中进行外部声明
class GameMap;
更改方法签名后:
void DoSomething(GameMap& map);
或者
void DoSomething(GameMap* map);
答案 3 :(得分:1)
您有一个循环包含问题。 GamePath.h包含apath.h,因此尝试在apath.h中包含GamePath.h最多是脆弱的,并且在最坏的情况下会出错(你的情况)。最好的办法是找到GamePath.h使用的apath.h,然后将它们重构为一个公共头文件,比如common.h,并在GamePath.h和apath.h中包含common.h。这样你就不再有圆形包含了,你可以绘制一个包含美丽DAG的图表。
答案 4 :(得分:1)
你正在尝试进行循环包含,这显然是被禁止的。
我建议你在apath.h中声明GameMap并将其作为const引用传递:
class GameMap; // forward declaration
class path
{
//some code...
void DoSomething(const GameMap &map);
//rest of class body
};
const ref比简单的ref更好,因为它明确告诉对象在函数调用期间不能改变。