2012-12-25 68 views
0

我的C++代码有问题。我知道有很多意见错误“预期类别名称之前{'标记”,但我仍然无法找到我拥有它的地方。这里是我的消息来源:'{'令牌之前的预期类名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 

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

非常感谢各位的建议。

+1

请注意,包含两个连续下划线的所有标识符都保留供C++编译器及其标准库使用,并且不允许使用它们。所有带有下划线后跟大写字母的标识符起始都一样。但这不是你的直接问题。你的问题是你的头文件之间有一个循环的依赖关系(就像很多有同样错误的问题一样)。 –

回答

6

相同的答案在所有类似的问题问过:

您创建了一个圆形包括序列

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

您在头文件中使用的包含守卫会“破坏”该循环中的某些不可预知或(更好的词)无法预料的方式。在你的情况下,包括守卫造成Postava.h首先物理包含,这就是为什么它对GrafickyObjekt一无所知,尽管它似乎明确包括GrafickyObjekt.h。因此错误。

通知包括没有意义,什么也没有。你必须按层次分层你的标题 - 从低级到高级 - 并确保高级标题包含低级标题,但从不反过来。

一旦你达到那种顺序,你可以继续通过引入前向类声明来解决循环数据依赖。我发现你已经试图做到这一点,并最终导致了一个彻底的灾难性混乱,你基本上在前面声明所有头文件中的所有类。摆脱那个混乱,并重新开始,通过首先修复包括分层。

+0

谢谢,这帮助了我......我把Postava.h包含在另一个包含在GrafickyObjekt.h中的文件中 – user1928543

1

看来,你以前的一些包括错误。

#include "HerniEngine.h" 
#include "Pozice.h" 
#include "Posun.h" 
相关问题