其他文件中的C++类

其他文件中的C++类,c++,class,C++,Class,我上课有点问题。 以下是我的一些代码: //GameMap.h #ifndef GAMEMAP_H #define GAMEMAP_H #include "apath.h" class GameMap { /*class definition here*/ }; #endif 及 我不能在apath.h中使用GameMap,当我尝试将GameMap.h包含在此文件中时,我会遇到一些愚蠢的错误。。。我还尝试添加类游戏地图;在定义路径类之前。没有任何帮助。。。我真的需要在这里使用它。。

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

//GameMap.h
#ifndef GAMEMAP_H
#define GAMEMAP_H
#include "apath.h"

class GameMap
{
    /*class definition here*/
};

#endif

我不能在apath.h中使用GameMap,当我尝试将GameMap.h包含在此文件中时,我会遇到一些愚蠢的错误。。。我还尝试添加类游戏地图;在定义路径类之前。没有任何帮助。。。我真的需要在这里使用它。。。 如果需要,我可以发布更多的代码


谢谢你的回复

您应该在apath.h中使用类GameMap的正向声明:

class GameMap; // forward declaration

class path
{
    //some code...
    void DoSomething(GameMap map);
    //rest of class body
};    
检查:

在下面的示例中,我使用类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


希望这能有所帮助。

在apath.h中进行外部声明

class GameMap;
更改方法签名后:

void DoSomething(GameMap& map);


你有一个循环包含问题。h包括apath.h,所以尝试在apath.h中包含GamePath.h最好是脆弱的,在最坏的情况下会出现错误。最好的办法是找到GamePath.h使用了哪些apath.h文件,并将它们重构成一个公共头文件,比如common.h,并在GamePath.h和apath.h中都包含common.h。这样你就不再有一个圆形的包含,你可以画一个包含图作为一个漂亮的DAG。

你应该检查这个习惯用法

在路径头中:

class GameMap;

class Path
{
public:
  void useMap( GameMap * map );
};
在路径源中:

#include "Path.h"
#include "GameMap.h"

void Path::useMap( GameMap * map )
{
  // Use map class
}

更多链接:和。

您正在尝试进行循环包含,这显然是被禁止的

我建议您在apath.h中转发声明GameMap,并将其作为常量引用传递:

class GameMap; // forward declaration

class path
{
    //some code...
    void DoSomething(const GameMap &map);
    //rest of class body
};

const ref比simple ref好,因为它明确地告诉我们对象在函数调用期间不能更改。

如何编译代码?好的,那么您在GameMap中使用类路径,在path中使用GameMap?可以使DoSomethingGameMap无效;是否无效DoSomethingGameMap&map;?另外,在GameMap中发布您的错误和路径的使用您的意思是什么?我使用DEV C++,所以明文。如果你的意思是关于文件,我在main中包含了GameMap,而GameMap.way1由于循环依赖性而无法工作。另外,我认为DoSomethingGameMap与DoSomethingconst GameMap是等价的&为什么他需要GameMap的引用?如果他只是需要它来改变一些内部状态,一个副本或常量引用也可以。@LihO woreked:D这不是你第一次帮助我了:thanx!4分钟后接受关键是你仍然可以通过值传递GameMap,正如你第一次写的。这不是PIMPL,只是P。@Pubby:这是真的。但PIMPL在网上有更好的文档,所以他也会理解转发声明。
#include "Path.h"
#include "GameMap.h"

void Path::useMap( GameMap * map )
{
  // Use map class
}
class GameMap; // forward declaration

class path
{
    //some code...
    void DoSomething(const GameMap &map);
    //rest of class body
};