2013-02-28 3 views
1

여기에 뭔가가 있습니까?C++ 클래스 프로토 타이핑

class Foo; 

class Bar { 
    public: 
     Foo foo; 
}; 

class Foo { }; 

오류 :

error C2079: 'Bar::foo' uses undefined class 'Foo'

+3

Foo가 정의되기 전에 Foo * foo, coz 포인터를 사용해야합니다. 컴파일러는 Foo의 크기를 알지 못하므로 Bar의 크기를 결정할 수 없습니다. –

+1

"... 불완전한 유형 'Foo'를 사용하면 더 명확한 오류 메시지가 표시됩니다. – Nemo

+0

*'바 '가 정의 된 시점에서 Foo는 정의되지 않았습니다 *. 컴파일러는'Bar'가 얼마나 많은 메모리 공간을 차지할지를 결정할 수 있어야하며'Foo'가 얼마나 큰지 아직 알지 못합니다. –

답변

8

당신이 클래스를 전방 선언 할 때, 당신이 그것에 포인터와 참조를 만들 수 있지만 앞으로 선언 클래스의 형식의 멤버를 만들 수 없습니다 : 전체 정의를 외부 클래스 (즉, Bar)의 레이아웃을 결정하려면 Foo이 필요합니다. 그렇지 않으면 컴파일러는 Bar의 크기와 구조를 결정할 수 없습니다.

는하지만, 허용 :

class Foo; 

class Bar { 
    public: 
     Foo* fooPtr; 
     Foo& fooRef; 
}; 

포인터와 참조하는 이유 전달 선언 클래스가 허용되는 포인터와 참조의 크기는 클래스의 구조에 의존하지 않는다는 것입니다에 그들이 포인트 (또는 참조).

0

예. 중요한 질문이 누락되었습니다. 질문이 있습니다.

나는 당신이 무엇이 잘못된 코드인지, 그리고 왜 컴파일러가 에러를 내는지 알고 싶다고 가정한다.

컴파일러는 클래스 막대의 레이아웃을 계산하기 위해 Foo의 크기를 알아야합니다. Foo 객체의 크기는 레이아웃에 의해 결정되며, 레이아웃을 알고 컴파일러는 클래스 정의를 알아야합니다. Member 변수 foo를 선언 할 때 Foo가 존재한다는 것을 알지만, 그 정의가 아니라 선언 만했기 때문에 크기는 아닙니다.