2009-09-28 3 views
17

다음을하려고합니다 :중첩 된 C++ 클래스가 그 둘러싸는 클래스를 상속 할 수 있습니까?

class Animal 
{ 
    class Bear : public Animal 
    { 
     // … 
    }; 

    class Giraffe : public Animal 
    { 
     // … 
    }; 
}; 

...하지만 내 컴파일러는 이것에 질식하는 것으로 보입니다. 이것은 합법적 인 C++인가요? 그렇지 않다면 같은 것을 성취하는 더 좋은 방법이 있습니까? 본질적으로, 나는 더 깨끗한 클래스 네이밍 스키마를 만들고 싶다. (저는 Animal와 내부 클래스를 공통 기본 클래스에서 파생시키고 싶지 않습니다)

+2

, 당신은 클래스 선언 후 세미콜론 닫는 중괄호를 따라야합니다. –

+0

왜 이렇게하고 싶은지 나는 분명하지 않습니다. 내가 올바르게 이해하면 Bear 클래스는 Bear 클래스를 포함하게 될 것입니다 ... 조금 이상하게 보입니다. –

답변

37

원하는대로 할 수 있지만 중첩 된 클래스의 정의를 지연해야합니다.

class Animal 
{ 
    class Bear; 
    class Giraffe; 
}; 

class Animal::Bear : public Animal {}; 

class Animal::Giraffe : public Animal {}; 
2

실제로 질문에 대답하지는 않지만 중첩 된 클래스를 잘못 사용하고 있다고 생각한다. 네임 스페이스를 살펴 봐야한다. 그런데 대답은 "동물은 불완전한 유형이기 때문에 가능하지 않습니다"입니다.

15

클래스 유형은 정의가 끝날 때까지 불완전한 것으로 간주됩니다. 불완전한 클래스로부터 상속받을 수 없으므로 클래스를 둘러싸는 것으로부터 상속받을 수 없습니다.

편집 : 수정
리처드 울프 나 수정으로 : 그것은 당신이 중첩 된 클래스의 정의를 지연하는 경우 클래스를 둘러싸는 상속 할 수 있습니다. 자세한 내용은 그의 대답을 참조하십시오.

+1

포함 된 클래스를 앞으로 선언하여 가능할 수 있습니다. –

+1

둘러싸는 클래스 밖에서 중첩 된 클래스를 정의 할 수 있다는 것을 몰랐습니다. 그러나 시도하고 놀랍게도 나를 위해, 그것은 작동합니다. –

+0

@ tkopec, 진술을 수정하기 위해 답을 수정하지 않으시겠습니까? 그것은 당신에게 당신의 두 점을 줄 것이고, 저에게 하나를 줄 것입니다. 나는 이상하다는 것을 알기 때문에, 특히 당신이 알고 있기 때문에 - 그것이 틀렸다, 지금. –

2

여기서 달성하고자하는 것이 분명하지 않지만 네임 스페이스를 통해 얻을 수 있습니다.

namespace creatures 
{ 

class Animal 
{ 
}; 

class Bear : public Animal 
{ 
}; 

class Giraffe : public Animal 
{ 
}; 


} 

이 동물의 유형으로 곰과 기린을 선언하지만 전역 네임 스페이스를 오염하지 않도록 기본 클래스를 찾고 있다면 네임 스페이스에 전체를 넣습니다.

0

"상속 상속"의 ATL 방법을 고려해 볼 가치가 있습니다. 이 작업을 수행 할 때마다 머리가 아플 수도 있지만 오브젝트 코드의 효율성은 탁월합니다. 어딘가에 나는 짐 베 버리지 (Jim Beveridge)가 내가 본 최고의 설명 인 기사를 잘라 냈지만, 오늘 찾아보기 힘들다.

"2004년 3월 25일 ... 짐 베버리지에서 훌륭한 기사 : ATL과 거꾸로 상속 ..."처음에는

+0

기사는 전기 천국에 갔지만 archive.org의 호의에 따라 http://web.archive.org/web/20070805214320/http://apostate.com/programming/atlupsidedown.html에서 액세스 할 수 있습니다. – ndkrempel