내가 클래스 템플릿을 가지고 ABC라는 이름의 클래스가 객체 다른 클래스 템플릿 매개 변수가있는 ABC 개체를 저장하려고합니다. 컴파일 할 때 포인터에 대해서도 템플릿을 지정해야합니까? 컨테이너가 다른 유형의 객체를 저장한다고 가정하면 어떻게 될까요? 그게 가능하지 않니?C++는
Q
C++는
7
A
답변
7
심지어 컴파일시 포인터에 대한 템플릿을 지정할 필요가 있습니까?
예.
컨테이너가 다른 유형의 객체를 저장할 예정이라면? 그게 가능하지 않니?
(직접) 가능하지 않습니다.
클래스 ABC와 같은 것은 없습니다. ABC<Foo>
및 ABC<Bar>
과 같은 ABC의 인스턴스화 만 있습니다. 이들은 완전히 다른 클래스입니다.
당신은 같은 것을 할 수 있습니다 : 이렇게
template<typename T>
class ABC : public ABC_Base
{
...
}
list<ABC_Base*> some_list;
를, 당신의 ABC 인스턴스화 모두 공통 기본 유형을 가지고, 당신은 임의로 기본 포인터를 사용할 수 있습니다.
1
CDE
클래스에 템플릿 매개 변수를 지정하거나 CDE
템플릿을 템플릿으로 지정해야합니다.
첫 번째 옵션 :
class CDE {
private:
list< ABC<int>* > some_list;
};
두 번째 옵션 :
template <class T>
class CDE {
private:
list< ABC<T>* > some_list;
};
1
목록에는 하나의 유형 만 저장할 수 있습니다. 템플리트의 다른 인스턴스화는 다른 유형입니다. 이 만족스러운 경우, 당신은 이런 식으로 작업을 수행 할 수 있습니다
template <class T> class CDE{ private: list<ABC<T> *> some_list; }
당신이 다른 유형을 사용해야하는 경우, 아마 당신은 그에게 ABC 저장 포인터를위한 템플릿이 아닌 기본 클래스를 만들 수 있습니다. (예 : 인터페이스 사용)
약간의 단점이 있습니다. 템플릿을 사용하는 모든 이유는 객체가 단단히 결합되어 있는지 확인하기 위해서였습니다. 이렇게하면 템플릿 유형없이 ABC_Base (또는 파생 클래스)의 객체를 만들고 목록에서 사용할 수 있습니다. – cyrux
@cyrux'ABC_Base'를 추상화하면 아무도'ABC_Base'의 객체를 만들 수 없습니다. – user470379