2014-11-08 4 views
0

경우 1에서는 오류가 발생하지만 경우 2에서는 오류가 발생하는 이유는 무엇입니까? 앞으로 declaraion 컴파일러는 다른 방법으로 취급합니까? 나는 클래스 apple 전체 파일을 검색하는 컴파일러에 대한 선언이라고 생각합니다.클래스의 정방향 선언으로 불완전한 형식 오류가 발생합니다.

// CASE 1 
class apple; // forward declaration 

class fruit{ 
    apple b; // error: incomplete type but why? there is no recursion I guess 
}; 

class apple{ 
    public: int a; 
}; 

int main(){ 
    fruit f; 
    return 0; 
} 

// CASE 2 
class apple{ 
    public: int a; 
}; 

class fruit{ 
    apple b; // no error works fine 
}; 

int main(){ 
    fruit f; 
    return 0; 
} 

설명해주십시오. 어떤 도움이라도 대단히 감사합니다.

답변

2

전달 선언은 포인터를 사용해야합니다. 다음은

class fruit{ 
    apple* b; // error: incomplete type but why? there is no recursion I guess 
}; 

그 이유는 클래스 열매를 생성 할 때, 컴파일러는 회원에 할당 메모리의 용량을 알 필요가 있다는 것입니다 컴파일해야한다. 포인터 인 경우에는 아키텍처에 따라 32 비트 또는 64 비트 중 하나를 사용하는 것이 쉽습니다. 이것이 앞으로 선언이 작동하는 이유입니다.

전체 개체를 할당하려고하면 컴파일러에서 큰 사과가 메모리를 예약하는 방법을 알아야합니다. 그러나 앞으로의 선언 일 뿐이므로 그 크기에 대한 지식이없고 오류를 보여줍니다.

2

전달 선언과 정의 이전에 fruit 클래스는 실제로 불완전한 유형입니다.

예를 들어, 포인터 또는 해당 유형에 대한 참조를 정의하거나 불완전한 유형을 매개 변수 또는 반환 유형으로 사용하는 함수를 선언 (정의하지 않음)하는 등의 제한된 방법으로 만 사용할 수 있습니다. 그러나 코드에서 포인터 또는 참조가 아닌 fruit 유형을 사용하고 있으므로 불법입니다.

관련 문제