来自其他文件的c ++类

时间:2012-02-05 17:53:14

标签: c++ class

我对课程有点问题。 以下是我的一些代码:

//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任何回复!

5 个答案:

答案 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
}

更多链接:linkconnected 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更好,因为它明确告诉对象在函数调用期间不能改变。