0

这基本上是我的课堂布局:

游戏驱动程序.h:

#ifndef GAMEDRIVER_H
#define GAMEDRIVER_H
#include "CameraSystem.h"

class CameraSystem; //Forward declaration

class GameDriver {
    //Stuff
};

#endif

相机系统.h:

#ifndef CAMERASYSTEM_H
#define CAMERASYSTEM_H
#include "Tickable.h"

class GameDriver;
class CameraSystem: public Tickable { //Complains here
    //Stuff
};

#endif

可勾选的.h:

#ifndef TICKABLE_H
#define TICKABLE_H
#include "GameDriver.h"
class GameDriver;
class Tickable {
    //Stuff
};

#endif

这是我得到的错误:

CameraSystem.h:9 error: expected class-name before '{' token

前向声明 Tickable 也不起作用。有什么帮助吗?提前致谢。

4

5 回答 5

3

如果您转发 delcare 一个类,则不应包含该类的标题。

#include "CameraSystem.h" // DO NOT INCLUDE THIS

class CameraSystem; //Forward declaration

class GameDriver {
    //Stuff
};
于 2012-08-12T18:45:17.220 回答
1

好的,我在这里看到两个问题。

首先:您的前向声明是无用的。您正在编写(以 GameDriver.h: 为例):

#include "CameraSystem.h"

class CameraSystem; //Forward declaration

class GameDriver {
    //Stuff
};

在这里,CameraSystem 将通过包含 CameraSystem.h 已知,因此前向声明是无稽之谈。你想写的是:

class CameraSystem; //Forward declaration

class GameDriver {
    //Stuff
};

第二:如果你真的需要前向声明,你不能使用它,因为你不能从前向声明的类派生:

#include "Tickable.h"

class CameraSystem: public Tickable { //Complains here
    //Stuff
};

请注意,当您不直接将前向声明的类用作类成员时,前向声明才有效。然后,您将被限制为指向前向声明的类的指针或引用。这样做的原因是,编译器不知道类的内存布局,除非它完全知道(即通过包含头文件)。例如:

class CameraSystem;
class GameDriver {
  CameraSystem m_cameraSystem;
};

不会工作。然而,

class CameraSystem;
class GameDriver {
  CameraSystem *m_cameraSystem;
  CameraSystem& m_otherCameraSystem;
};

将要。当然,您仍然必须在 *.cpp 文件中包含正确的头文件。

于 2012-08-12T18:49:23.120 回答
0

你无法解决这样的循环依赖。但是,您已经获得了解决方案(部分):

即不包括标题,而是使用前向声明。如果你做对了,应该没有任何问题。但是,请尝试将您的程序分组为逻辑元素/组,并且仅在需要时添加交叉引用(例如,游戏必须知道并访问相机,但相机不应该作为访问游戏系统的所有的)。

于 2012-08-12T18:47:30.120 回答
0

您不能从尚未声明的类继承。

预处理Tickable.h为您提供:

class GameDriver;
class CameraSystem: public Tickable { //Complains here
    //Stuff
};

class CameraSystem; //Forward declaration

class GameDriver {
    //Stuff
};

class GameDriver;
class Tickable {
    //Stuff
};

看看Tickable当你从它继承时甚至没有被前向声明?

于 2012-08-12T19:07:17.270 回答
-2

尝试#pragma once在每个头文件的开头添加。

您应该以某种方式告诉编译器只放置一次。这是一种方式。另一个是使用#ifndef Xand #define X

如果这不能解决它,请尝试消除循环依赖 - 它似乎不必发生......

于 2012-08-12T18:43:25.033 回答