2012-12-25 4 views
0

내 C++ 코드에 문제가 있습니다. 나는 "{ '토큰"앞에 클래스 이름이 예상되지만, 아직 내가 가지고있는 곳을 찾을 수 없다는 많은 조언이 있다는 것을 알고 있습니다. 이 체코의, 내 영어와 클래스의 이름과 변수의 이름'{'토큰 앞에 예상 클래스 이름이 있습니다. C++

#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 

죄송합니다

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 : 여기 내 소스입니다.

모든 조언을 주셔서 감사합니다.

+1

두 개의 연속 된 밑줄을 포함하는 모든 식별자는 C++ 컴파일러와 표준 라이브러리에서 사용하기 위해 예약되어 있으므로 사용자는이를 사용할 수 없습니다. 밑줄과 대문자로 시작하는 모든 식별자 시작에 대해서도 동일하게 적용됩니다. 그러나 이것은 당신의 즉각적인 문제는 아닙니다. 문제는 헤더 사이에주기적인 종속성이 있다는 것입니다 (동일한 오류가있는 많은 문제의 경우와 동일). –

답변

6

같은 대답 :

당신은 원형 그것은 당신이 게시되지 않았기 때문에 당신이 (지금까지 게시 된 것과 명확하지 않다 순서

을 포함 생성 모든 헤더). 그러나 다른 헤더 파일을 함께 가져 와서 순환 포함 경로 "경로"를 만들어내는 것이 안전한 방법입니다. 더 정확하게는 GrafickyObjekt.h에 간접적으로 Postava.h이 포함되어 있습니다 (게시하지 않은 다른 헤더 파일을 통해).

헤더 파일에서 사용한 포함 가드는 예측할 수 없거나 (더 나은 단어) 예기치 않은 코드에서 해당주기를 "중단"합니다. 방식입니다. 귀하의 경우에는 포함 경비원이 Postava.h을 먼저 포함 시켰으므로 인 것처럼 보이지만 GrafickyObjekt.h이 명시 적으로 포함되어 있더라도 GrafickyObjekt에 대해 아무것도 모르는 이유입니다. 따라서 오류.

순환 포함은 의미가 없으며 아무 것도 얻지 못합니다. 낮은 레벨에서 높은 레벨까지 레벨별로 헤더를 층화해야하며 상위 레벨 헤더에는 하위 레벨 헤더가 포함되지만 다른 방법은 절대 사용하지 마십시오.

일단 이러한 정렬을 달성하면 순방향 클래스 선언을 도입하여 순환 데이터 종속성을 해결할 수 있습니다. 나는 당신이 이미 그렇게하려고 시도했음을보고, 모든 헤더의 모든 클래스들을 기본적으로 앞으로 선언하는 총체적인 재앙적인 혼란으로 끝났습니다. 그 뒤죽박죽을 없애고 우선 층화를 수정하여 시작하십시오.

+0

감사합니다. 그 덕분에 ... Postava.h는 GrafickyObjekt.h에 포함 된 다른 파일에 포함 시켰습니다. – user1928543

1

이전 포함의 일부에 결함이있는 것으로 보입니다.

#include "HerniEngine.h" 
#include "Pozice.h" 
#include "Posun.h" 
하기 전에 물어 보는 모든 유사한 질문에서와
관련 문제