不能使用另一个hpp文件中定义的类

时间:2013-12-01 20:17:17

标签: c++ class include

我在尝试在“userAux.hpp”文件中使用我的“gameAux”类时遇到了一些问题。

以下是我制作的两个hpp文件。

我标记了出错的地方。

userAux.hpp:

#include "gameAux.hpp"


class userAux{
   int gameId;
   int userId;
   int rate;
   gameAux aGame; <---error: ‘gameAux’ does not name a type
};

gameAux.hpp:

#include "userAux.hpp"

class gameAux{
  int gameId;
  userAux aUser; <--- OK
};

如果有人能指出问题是什么,我会很高兴的。)

3 个答案:

答案 0 :(得分:1)

你的问题是你的两个课程都相互依赖。当编译器去查看它需要为gameAux个对象保留多少空间时,它说'好吧,我需要一个int和一个userAux来适应那里'。那么接下来的问题是,int和userAux对象需要多少空间?

然后,当它试图弄清楚userAux对象需要多少空间时,它会说'好,三个整数和一个gameAux对象'......并且存在问题。它将继续在这两个文件之间来回切换,试图找出每个文件需要多少空间,并且永远无法弄明白。

要解决此问题,您需要让其中一个类依赖于引用指针到另一个类。由于引用和指针总是在给定系统上占用相同的空间量,因此编译器将能够为userAux分配空间,如果它看到:

class gameAux;

class userAux{
   int gameId;
   int userId;
   int rate;
   gameAux &aGame; // or gameAux *aGame; // <---error: ‘gameAux’ does not name a type
};

然后它将为两个对象分配空间,没有问题^^

编辑:此外,你不需要在userAux.hpp的顶部{@ 1}更新gameAux的头文件 - 只需在文件的顶部正向声明gameAux:{{1 }}

答案 1 :(得分:1)

您不能让一个类包含另一个类的实例,并让其他类包含第一个类的实例。这是无限递归,显然无法正常工作。

答案是使用指针和前向声明。

class gameAux; // forward declaration

class userAux{
   int gameId;
   int userId;
   int rate;
   gameAux* aGame;
};

class gameAux{
  int gameId;
  userAux* aUser;
};

当两个类相互依赖时,我很想将它们放在同一个头文件中。但是,如果您需要单独的头文件,则可以转发声明其他类头文件中的每个类。这样,头文件都不需要包含另一个。

答案 2 :(得分:0)

您不需要包含整个类定义。您只需向前声明并使用指针即可避免循环依赖:

#include "gameAux.hpp"

class gameAux;     // forward declaration

class userAux{
   int gameId;
   int userId;
   int rate;
   gameAux *aGame;
};

,反之亦然在另一个文件中。然后#include每个类的实现源文件中的相应hpp头。