0

我的 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

对不起我的英语以及类名和变量名,它是捷克语。

非常感谢每一个建议。

4

2 回答 2

6

与之前提出的所有类似问题的答案相同:

您创建了一个循环包含序列

从您到目前为止发布的内容中并不明显(因为您尚未发布所有标题)。但可以肯定的是,您的其他头文件一起必须产生一个循环包含“路径”。更准确地说,您GrafickyObjekt.h以某种方式间接包含Postava.h(通过您尚未发布的其他头文件)。

您在头文件中使用的包含保护将以某种不可预测或(更好的词)不可预见的方式“打破”该循环。在您的情况下, include 守卫Postava.h首先被物理包含,这就是为什么GrafickyObjekt即使它似乎明确地包含GrafickyObjekt.h. 因此错误。

循环包括毫无意义,一事无成。您必须按级别对标题进行分层 - 从低级别到高级 - 并确保较高级别的标题包含较低级别的标题,但绝不会反过来。

一旦实现了这种顺序,就可以通过引入前向类声明来解决循环数据依赖关系。我看到您已经尝试过这样做并最终导致完全灾难性的混乱,您基本上在所有标题中前向声明所有类。通过首先修复包含分层,摆脱混乱并重新开始。

于 2012-12-25T17:45:30.107 回答
1

您以前的某些包含似乎有问题。

#include "HerniEngine.h"
#include "Pozice.h"
#include "Posun.h"
于 2012-12-25T17:41:51.097 回答