2017-02-06 19 views
4

"C++ primer"에는 클래스 선언과 정의에 관한 절이 있습니다. 나는이 문장에 대한 모든 것을 이해하지 못한다 :클래스가 정의 된 경우에만 데이터 멤버를 클래스 유형으로 지정할 수있는 이유는 무엇입니까? ("C++ primer"에서)

데이터 멤버는 클래스가 정의 된 경우에만 클래스 유형으로 지정할 수있다.

이 문장의 논리를 이해하지 못합니다. 데이터 멤버를 클래스 유형으로 지정하려면 어떻게합니까?이 작업은 무엇을 의미합니까?

+1

클래스 유형이하는'class' 또는'struct'로 표시되는 유형 인 내장 타입입니다. 문장은 해당 클래스가 정의 된 경우 (즉, 전달 선언되지 않은 경우)에만 클래스 유형이 될 수 있음을 의미합니다. 그러나 불완전한 유형에 대한 포인터 또는 참조를 가질 수 있습니다. –

답변

8

은 클래스 타입 T의 비 정적 클래스의 데이터 멤버 선언, Tcomplete는 것이 요구되는 것을 의미한다.

( T의 크기와 레이아웃이 알려 져야 할 때, 일반적.)

예컨대 반대로 한편

class foo; // forward declaration 
class bar { 
    foo f; // error; foo is incomplete 
}; 

,

class foo {}; // definition 
class bar { 
    foo f; // fine; foo is complete 
}; 
3

는 나는이 컴파일 것을 의미 믿습니다

class A 
{ 
public: 
    A() {/* empty */} 
}; 

class B 
{ 
public: 
    B() {/* empty */} 

private: 
    A myClassMember; // ok 
}; 

을 ....하지만이되지 않습니다

class A; // forward declaration only! 

class B 
{ 
public: 
    B() {/* empty */} 

private: 
    A myClassMember; // error, class A has only been declared, not defined! 
}; 
+0

당신은 A. –

+0

또는 B의 대괄호 사이에 아무 것도 필요하지 않습니다. 의견은 항상 선택 사항이지만이 경우 독자는 독자가 독자가 뭔가를 버리고 잊어 버리려는 의도는 아니라고 생각할 수 있습니다. –

+0

나는 C 클래스뿐만 아니라 A의 전체 클래스를 의미했습니다. 이 대답을 이해하려면 B에 _something_이 필요합니다. 구체적으로 A 유형의 필드이지만 A 내부에는 아무 것도 필요하지 않습니다. 또한 원래 의견이 분명하지 않지만 의견을 계산하지 않았습니다. 나는 당신이 실제 코드를 필요로하지 않는다는 것을 의미했다. –

2

그것은 member의이 스펙이 유효하지 않음을 의미, A 선언되어 있기 때문에 정의되지 않음 :

class A; 

class B { 
    A member; 
}; 

허용되지 않는 한 가지 이유는 다음과 같습니다. se sizeof(A) 알 수 없습니다.

class A { 
    int value; 
}; 

class B { 
    A member; 
}; 

그리고이 A가 (만 선언) 정의되지 않은 경우에도 유효합니다 member 클래스 유형이 아닌,하지만 포인터 타입 때문에, : A가 정의되어 있기 때문에

이것은, 그러나, 유효합니다 :

class B { 
    A* member; 
};