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(あなたが投稿していない他のヘッダーファイルを介して)インクルードします。

ヘッダーファイルで使用したインクルードガードは、予測できない、または(より適切な言葉で)予期しない方法でそのサイクルを「中断」します。あなたの場合、インクルードガードが最初に物理的にインクルードされるようになりました。そのため、明示的にインクルードしているように見えても、Postava.h何も知りません。したがって、エラー。GrafickyObjektGrafickyObjekt.h

サーキュラーインクルードは意味がなく、何も達成しません。ヘッダーをレベルごとに(低レベルから高レベルまで)階層化し、高レベルのヘッダーに低レベルのヘッダーが含まれていることを確認する必要がありますが、その逆はありません。

この種の順序を達成したら、フォワードクラス宣言を導入することにより、循環データの依存関係の解決に進むことができます。あなたはすでにそれを試みて、完全に壊滅的な混乱に終わったようです。そこでは、基本的にすべてのヘッダーのすべてのクラスを前方宣言します。最初に包含層化を修正することにより、その混乱を取り除き、最初からやり直します。

于 2012-12-25T17:45:30.107 に答える
1

以前のインクルードの一部に欠陥があるようです。

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