2012-12-09 9 views
5

내가 다음과 같은 클래스를 가지고 말 : 내 파생 클래스에서파생 클래스에서 기본 클래스의 멤버를 별칭으로 지정할 수 있습니까?

template <class T> 
class Base { 
    protected: 
    T theT; 
    // ... 
}; 

class Derived : protected Base <int>, protected Base <float> { 
    protected: 
    // ... 
    using theInt = Base<int>::theT;  // How do I accomplish this?? 
    using theFloat = Base<float>::theT; // How do I accomplish this?? 
}; 

, 내가 파생 클래스에서 더 의미가보다 직관적 인 이름을 사용 Base::theT를 참조하고 싶습니다. 나는 GCC 4.7을 사용하고 있는데, C++ 11의 기능이 꽤 잘 설명되어있다. 위의 예제에서 내가 시도한 이런 종류의 작업을 수행하기 위해 using 문을 사용하는 방법이 있습니까? C++ 11에서는 using 키워드를 사용하여 유형을 별명으로 지정하거나 예를 들어 알 수 있습니다. 보호 된 기본 클래스 멤버를 공용 범위로 가져옵니다. 멤버에게 앨리어싱을 적용하는 비슷한 메커니즘이 있습니까?

+4

나는 당신에게 참조가 필요하거나 아마 파생 된 클래스에서 공간을 차지하지 않는 함수가 필요할 것이라고 생각한다. : | – Xeo

+0

감사합니다. 참조가 적용되었습니다. –

답변

6

제오의 팁이 작동했습니다. 당신이 C++ (11)를 사용하는 경우, 당신과 같이 별칭을 선언 할 수

int &theInt; 
float &theFloat; 
// ... 
Derived() : theInt(Base<int>::theT), theFloat(Base<float>::theT) { 
    theInt = // some default 
    theFloat = // some default 
} 
:

int &theInt = Base<int>::theT; 
float &theFloat = Base<float>::theT; 

당신이 C++ (11)이없는 경우, 당신은 또한 생성자를 초기화 할 수 있다고 생각

편집 : 약간의 번거 로움은 생성자의 본체 (예 : 중괄호 안)까지 별칭이 지정된 멤버의 값을 초기화 할 수 없다는 것입니다.

+3

이것은 sizeof (void *)와 참조의 수를 곱하여 파생 된 클래스의 크기를 증가시킨다. 그래서'theXXX'라는 간단한 getter 함수를 제안했습니다. – Xeo

+0

예, 당신이 옳다고 생각합니다. 다행히 파생 클래스의 인스턴스가 많지 않으므로 추가 8 바이트는 나를 죽이지 않을 것이라고 생각합니다. 따라서 데이터 멤버에 액세스 할 때 참조하기 쉬운 버전을 사용할 수 있습니다. –

관련 문제