我的c ++代码有问题。我知道有很多建议有错误“'''令牌之前的预期类名”,但我仍然找不到我拥有它的地方。这是我的消息来源:
Postava.h
#include <exception>
#include <string>
using namespace std;
#ifndef __Postava_h__
#define __Postava_h__
#include "Barva.h"
#include "Pozice.h"
//#include "Budova.h"
//#include "HerniEngine.h"
#include "GrafickyObjekt.h"
class Budova;
class HerniEngine;
//class GrafickyObjekt;
class Postava;
struct Barva;
struct Pozice;
class Postava:public GrafickyObjekt{ //<----- Here is the error
private:
std::string m_jmeno;
int m_nosnost;
public:
Postava(std::string jmeno, int nosnost);
Budova* m_Budova;
HerniEngine* m_HerniEngine;
std::string vratJmeno();
int vratNosnost();
void vykresli();
};
#endif
GrafickyObjekt.h
#ifndef __GrafickyObjekt_h__
#define __GrafickyObjekt_h__
#include "HerniEngine.h"
#include "Pozice.h"
#include "Posun.h"
class HerniEngine;
class GrafickyObjekt;
class Scena;
struct Pozice;
struct Posun;
class HerniEngine;
class GrafickyObjekt {
protected:
Pozice m_pozice;
public:
HerniEngine* m_HerniEngine;
// kazdy potomek, tj. graf. obj. ma pozici
GrafickyObjekt(Pozice pozice);
// vsichni potomci ji musi implementovat
virtual void vykresli() = 0;
// tyto metody nejsou (ciste) virtualni, budou normalne zdedeny
// tim mam zaruceno, ze vsichni potomci je maji
void pohni(Posun posun);
void pohni(Pozice pozice);
};
#endif
对不起我的英文以及班级名称和变量名称,这是捷克语。
非常感谢每一条建议。
答案 0 :(得分:6)
与之前提出的所有类似问题相同的答案:
您创建了循环包含序列
到目前为止,您发布的内容并不明显(因为您尚未发布所有标题)。但是可以肯定的是,你的其他头文件必须产生一个循环包含“路径”。更准确地说,您的GrafickyObjekt.h
以某种方式间接包含Postava.h
(通过您尚未发布的其他标题文件)。
您在头文件中使用的包含保护将以某种不可预测或(更好的词)无法预料的方式“中断”该周期。在你的情况下,包含警卫导致Postava.h
首先被物理包含在内,这就是为什么它对GrafickyObjekt
一无所知,即使它似乎明确包含GrafickyObjekt.h
。因此错误。
循环包括毫无意义,一无所获。您必须按级别(从低级别到高级别)对标题进行分层,并确保较高级别的标题包含较低级别的标题,但绝不会反过来。
一旦达到这种顺序,就可以通过引入前向类声明来继续解决循环数据依赖性。我看到你已经尝试过这样做,结果发生了灾难性的混乱,你基本上在所有标题中向前声明所有类。通过首先修复包含分层来摆脱这种混乱并重新开始。
答案 1 :(得分:1)
您之前的某些内容似乎有问题。
#include "HerniEngine.h"
#include "Pozice.h"
#include "Posun.h"