2012-05-31 2 views
-1
에 대한 재귀 헤더

의 난이 같은 컴파일하고 싶은 말은하자C++ 추상 클래스

//Prova.h: 
//-------------------- 
#ifndef _PROVA_ 
#define _PROVA_ 

#include "Terza.h" 

class Prova{ 
public: 
Prova(); 

}; 
#endif 

//Terza.h: 
//-------------------- 
#ifndef _TERZA_ 
#define _TERZA_ 

#include "EreProva.h" 

class Terza{ 
public: 
    Terza(); 
}; 
#endif 

//EreProva.h: 
//-------------------- 
#ifndef _EREPROVA_ 
#define _EREPROVA_ 

#include "Prova.h" 

class EreProva : public Prova{ 
    public: 
    EreProva(); 
}; 
#endif 

느릅 나무 '는 "말을 컴파일하지 않습니다 Prova ': 정의되지 않은 기본 클래스 ". (1) 상단에있는 "의 #pragma 한 번"지시문을 추가하려고 :

은 다음 트링으로 이런 종류의 문제를 해결할 수 있습니다

때때로
+0

이것에 대한 초록 무엇입니까? 아이 옥 세이의 대답을 받아 들여야합니다. –

답변

0

상속 클래스 사이 헤더의 재귀를 방지하는 가장 좋은 방법은 무엇입니까 이 파일은 컴파일러에 따라 다를 수 있지만 (예전에 VC++로 개발할 때 사용했습니다) (2) 클래스에 헤더 파일을 포함하는 대신 "클래스 Prova"를 추가하거나 클래스를 추가 할 수 있습니다 나중에 정의하지만 나중에 "사용"하고자하는 클래스를 나타냅니다.

Als가 말한 것처럼 그러한 디자인을 피하는 것이 좋습니다.

4

주기적 종속성이 필요한 경우 디자인에 문제가 있으며 디자인을 다시 방문하여 복잡하고 원치 않는 순환 종속성을 제거해야합니다. 순환 종속성을 극복

하나는 Forward Declarations을 사용하는 것입니다,하지만 당신은 앞으로 형식을 선언하면 유형이 컴파일러 불완전한 유형이되고 당신이 그것으로 할 수있는 작업에 대한 제한이 있습니다. 유형의 메모리 레이아웃을 알기 위해 컴파일러가 필요한 해당 유형 인스턴스에 대해 어떠한 조작도 수행 할 수 없습니다.

좋은 읽기 :이 코드에서
When can I use a forward declaration?

+0

+1 부러진 디자인을 언급합니다. ** 중요한 비트입니다 ** 주위를 둘러 쌀 수있는 구문 론적 트릭이 아닙니다. –

+0

Terza가지도라고 가정 해 봅시다. Prova는 그지도에서 움직이기 원하는 것입니다. EreProva는 해당지도의 기본 사각형입니다. 프로 바를 움직이려면지도를 알아야 해. 지도를 그리려면 사각형을 사용해야합니다. –

+0

사실, 이걸 좀 더 자세히 보았으니 ... –

0

: 당신은 어떤 방법으로 Tezra 클래스를 사용하지 않기 때문에

//Prova.h: 
//-------------------- 
#ifndef _PROVA_ 
#define _PROVA_ 

#include "Terza.h" 

class Prova{ 
public: 
Prova(); 

}; 

, 당신은 #include 필요하지 않습니다. 그것을 꺼내. 또한 누락 된 상태와 #endif가 있습니다. 이 파일의 #ifndef#endif의 파일과 함께 닫습니다. 또한

는 :

//Terza.h: 
//-------------------- 
#ifndef _TERZA_ 
#define _TERZA_ 

#include "EreProva.h" 

class Terza{ 
public: 
    Terza(); 
}; 
#endif 

#endif 

또한 모든이 파일의 EreProva 클래스를 사용하지 않는 - 그래서 #include 문을 꺼내. 또한 파일 끝에 여분의 #endif이 있습니다. 여기서 #ifndef 하나만 있으므로 #endif 하나만 있어야합니다. 마지막 하나 가져 가라.

+0

제가 포함을 사용하고 있지 않다는 것을 알고 있습니다, 이것은 단지 예일뿐입니다. –

+0

실제 문제를 보여주는 실제 코드를 게시하십시오 데. 그럼 우리는 당신에게 더 나은 조언을 줄 수 있습니다. –

+0

답장을 보내 주셔서 감사합니다. 내 문제는 일을 컴파일하는 방법입니다. 내가 포함 된 모든 헤더를 사용해야합니다. 예를 들어 변수 EreProva를 Terza에서 인스턴스화하고 변수 Terza를 Prova에서 인스턴스화합니다. 클래스 의존성을 다시 생각하는 것 외에 다른 방법이 있는지 알고 싶습니다. –