2014-03-12 2 views
3

"C2143 : 구문 오류 : 누락되었습니다 ';' '*'Track.h 에서 전에이가 "실종"클래스 정의로 인해 생각알 수없는 클래스입니까? C2143 구문 오류 : 누락 된 ";" before '*'

을 이들은 3 헤더 파일은 다음과 같습니다.

Topics.h, 패키지 레벨의 헤더 파일 # 포함 다른 모든 것들 :

#ifndef Topics_H 
#define Topics_H 

#include <oxf\oxf.h> 
#include "Request.h" 
#include "TDPoint.h" 
#include "Track.h" 
#include "TrackReport.h" 

#endif 

그리고 단순히 3 개 긴 속성을 가진 클래스를 정의 ("3DPoint"에서와 같이) TDPoint, 거기 :

#ifndef TDPoint_H 
#define TDPoint_H 

#include <oxf\oxf.h> // Just IBM Rational Rhapsody's Framework 
#include "Topics.h" 

class TDPoint { 
    //// Constructors and destructors //// 

public : 

    TDPoint(); 

    ~TDPoint(); 

    //// Additional operations //// 

long getX() const;  
void setX(long p_x); 
long getY() const;  
void setY(long p_y);  
long getZ() const; 
void setZ(long p_z); 

    //// Attributes //// 

protected : 

    long x;  
    long y;  
    long z;}; 

#endif 

그러나 문제의 리 표시된 라인, 여기 말이지 :

#ifndef Track_H 
#define Track_H 

#include <oxf\oxf.h> // Just IBM Rational Rhapsody's Framework 
#include "Topics.h" 
#include "TDPoint.h" 

class Track { 

public : 

    //// Operations  //// 

    std::string getId() const; 

    void setId(std::string p_id); 

    TDPoint* getPosition() const; // <--- This line, the first line to use TDPoint, throws the error 

    //// Attributes //// 

protected : 

    std::string id; 

    TDPoint position; 

public : 

    Track(); 
    ~Track(); 
}; 

#endif 

내 생각 엔 컴파일러 (MS VS2008/MSVC9가) 단순히 클래스 몰랐다 그러나 심지어 "와 같은 헤더 파일에 클래스를 정의하는 것이 었습니다"TDPoint을. " Track "을 사용하거나"class TDPoint "와 같은 전달 선언을 사용하면 (undefined class : 오류가 발생 함) 도움이되지 않습니다. 코드가 Rhapsody에서 자동 생성되었으므로 차이가 발생합니다.

하지만 오류가 완전히 다른 것일 수 있습니까?

+0

당신은'void setId (std :: string p_id);'를 가지고 있지만''에 대한 포함을 보지 못했습니다. – StoryTeller

답변

6

Topics.h 당신은 하나 앞으로 해결하기 위해 클래스를 선언해야 ... TDPoint.hTrack.h

TDPoint.hTopics.h

Track.h 모두 Topics.hTDPoint.h

원형은 다음과 같습니다 같은이 느낌을 포함 포함 포함 또는 원형을 갖지 않도록 Topics.h을 수정하십시오.

+0

고마워, 나는 그게 명백한 무언가라고 의심했다. 내가 경호원들이 이것을 해결할 것이라고 생각 했어. 이제는 다중 및 순환 포함 사이의 차이를 배웠습니다. 경비원을 포함하면 후자에 대한 보호가되지 않습니다. 랩소디의 자동 생성 코드가 이처럼 간단한 실수를하는 것을 보니 슬프다. 감사합니다. –

3

당신은 원형 포함이 : 파일 Track.hTDPoint 클래스가 선언되지 Track.h을 포함 Topics.h 포함 TDPoints.h 포함 Topics.h이 포함되어 있습니다.

사실, TDPoint.h에는 전혀 헤더 파일이 필요하지 않습니다. 질문에 표시된 코드에 따라 완전히 독립적입니다.

Track.h 파일은 Topics.h이 아니라 TDPoint.h을 포함하면됩니다. (가능하면 <string>)

일반 힌트 : 가능한 한 적은 헤더 파일을 헤더 파일에 포함하십시오.

+0

고마워, 슬프게도 나는 1 개의 대답만을 선택할 수있다 - 너의 것이 동일하다는 것을, 나는 첫번째 것을 선택했다. –

관련 문제