이것은 google's c++ coding guidelines에서 발췌 한 것입니다.정의에 액세스하지 않고 헤더 파일에서 클래스를 사용합니까?
헤더의 정의에서 Foo 클래스를 어떻게 사용할 수 있습니까?
- Foo * 또는 Foo & 유형의 데이터 멤버를 선언 할 수 있습니다.
- 인수를 사용하여 함수를 선언 할 수 있지만 Foo 유형의 반환 값을 선언 할 수 있습니다. (한 예외는 인수 푸 또는 const를 푸 & 우리가 지원 자동 타입 변환에 대한 전체 정의를 필요로하는 경우가 아닌 명시 적, 한 인수 생성자가있는 경우입니다.)
- 것은 우리는 정적 선언 할 수 있습니다 Foo 유형의 데이터 멤버. 그 이유는 정적 데이터 멤버가 클래스 정의 외부에서 정의 되었기 때문입니다.
궁금한 점은 두 번째 글 머리 기호에서 예외입니다. 이게 왜 그렇게? 자동 유형 변환을 지원하려면 전체 정의가 필요한 이유는 무엇입니까?
내 생각에 암시 적 변환시 생성 된 임시 개체 때문에 컴파일러에서 대상 형식의 전체 정의가 필요합니다. 나는 정확하게 추측하고 있는가? 더 많은 것이 있습니까?
편집 : 제가보기에는
, 가이드 라인에서 예외가 같은 상황으로 주소 :
여기class A
{
public:
A(int);
};
class B
{
public:
B(A const &a);
};
int main()
{
B b(2);
}
우리 (A까지 INT에서) 하나의 사용자 정의 암시 적 변환이 const &을 허용하는 생성자를 호출합니다. 이 예외에서 의미가있는 것은 직접 변환을 지원하는 것입니다. int를 A로, 그리고 B를 const &을 수락하는 생성자를 통해 전달함으로써 A 클래스가 선언 된 헤더 파일을 명시 적으로 포함 할 필요없이 클라이언트 코드가이 변환 체인을 사용할 수 있도록합니다.
-. 임시 개체에 대한 걱정도 전에 컴파일러는 암시 적 변환을 허용하기 전에 생성자가 존재한다는 것을 알 필요가있다. 하지만 그렇습니다. 컴파일러는 임시/인수 공간을 할당하고 생성자를 호출하는 코드를 생성해야하므로 크기 및 생성자 선언이 필요합니다. –
컴파일러가 변환 할 수 있음을 알기에 충분한 생성자의 선언 및 소스 유형 선언이 아닙니까? 그래도 답장을 보내 주셔서 감사합니다. – LavaScornedOven
@Vedran : 네, 스티브가 말한 것입니다. Google 가이드 라인의 경우 가이드 라인의 규칙 예외가 의미가 없음을 의미합니다. 지침은 "[클래스] 정의에 대한 액세스 권한 없음"에 대해 이야기합니다. 이 경우 크기 나 생성자 정의가 알려져 있지 않습니다. 그래서 그것은 문제가 아닙니다. –