2013-01-15 5 views
0

정의와 구현을 나중에 프로그램에 넣기 위해 클래스에 대해 전달 선언을 사용할 수 있습니까 (함수에 대해 수행 한 것과 유사)?클래스 forward 선언

(프로그램의 여러 소스 파일을 파일에 결합해야하며 파일의 끝에이되도록 클래스의 정의와 구현을 파일 끝에 넣으려고합니다.)

+2

시도해 보셨습니까? 컴파일러 오류가 발생 했습니까? 간단한 예제를 작성하고 시험해보기 위해 1 분 이상 걸리지 않아야합니다. – abelenky

+0

다른 방법으로는'main'을 맨 아래에 놓고 이슈를 무시할 수 있습니다. 응답은 클래스의 전달 선언이 제한적으로 사용된다는 것입니다. –

+0

@abelenky 예, MS VS 1에서의 errCode> 오류 C2079 : 'student_list'는 정의되지 않은 클래스 'Student_list'를 사용합니다. – MTVS

답변

2

네, 어느 정도까지 할 수 있습니다.

C++ 컴파일러가 매우 어리 석고 앞서 읽지 않는다는 것을 알아야합니다. 이것이 (다른 이유로) 함수 프로토 타입을 사용해야하는 이유입니다. 이제 컴파일러가 해결할 수있는 기능이 없습니다. 함수의 반환 형식과 함수의 매개 변수 형식을 살펴보고 실제로 함수 내부에 무엇이 있는지에 대한 지식이 없어도 함수가 있다고 가정합니다. 그 점에서 궁극적으로 중요하지 않으므로 .

그러나 클래스의 내용이 중요합니다 (예 : 컴파일러가 클래스의 크기를 알아야 함). 그러나 미리 읽지 않는 것에 대해 기억하십니까? 클래스를 포워드 할 때 컴파일러는 그 안에 무엇이 있는지 모르기 때문에 많은 정보가 빠져있다. 얼마나 많은 공간이 예를 들어 예약해야합니까?

따라서 클래스를 전달할 수는 있지만 유형으로 사용할 수는 없습니다. 당신이 그것으로 할 수있는 유일한 일은 (그것이 구체적으로 선언되기 전에) 포인터를 사용하는 것입니다 (함수의 리턴 타입과 템플릿 인자로 포인터를 사용하여 @ Cheersandhth.-Alf).

사용할 항목이 포인터가 아닌 경우 머리글을 사용해야합니다 (자세한 내용은 this을 참조하십시오).

+0

-1 "구체적으로 선언되기 전에 할 수있는 유일한 방법은 포인터를 사용하는 것입니다 . " 부정확하다. "가치 유형"이 의미하는 바를 추측하기는 어렵습니다. 그러나 "값 유형으로 사용할 수 없다"는 인상은 값으로 전달되는 형식적 인수에 사용할 수없는 것과 마찬가지이며 잘못된 것입니다. –

+0

@ Cheersandhth.-Alf 심지어 친구를 주석하기 전에 그것을 수정했습니다. – antonijn

+0

그래서 클래스를 정의 할 때까지 역 참조 할 수없는 포인터가 있습니다. 프록시 클래스에서 사용하는 것을 제외하고는 무엇을 사용합니까? – MTVS

1

클래스 정의 어딘가에 이전에, 당신이 어떤 클래스 멤버를 사용할 수 없으며이 인스턴스를 만들 수 없다면,하지만 할 수 있습니다

  • 사용 T * 및 T & 유형,

  • 템플릿 매개 변수로, 정식 반환 형식과 매개 변수 선언 (예도 값을 기준으로)에 대한

  • 사용 T를 T를 사용

그리고 아마도 그 이상이 나에게 일어났습니다.

그래서 필요한 것이면 앞으로 선언문을 사용할 수 있습니다.

그러나 앞으로 선언 한 모든 상황이 스케치 된 상황에서 이 추가 된 작업인데 두 코드에서 동일한 코드를 유지하므로 그 지점을보기가 어렵습니다 & hellip; 아, 난 그냥 기억


, 즉 p이 불완전 형에 대한 포인터입니다 delete p를 사용하여 앞으로 선언 불완전한 유형과 연관된 특히 불쾌한 정의되지 않은 동작이있다. 이것은 소멸자가 사소한 것이 요구된다. 컴파일러가 좋으면 경고하지만 예상하지 못합니다.요약


, 난 그냥 모든 문제를 방지 속하는 코드의 매우 main을 배치한다.