[완료] c++ 템플릿 관련 질문
자료구조 공부하면서 컨테이너 템플릿을 하나 만들었어요.
여기에 다른 객체는 적용이 잘 되는데, 한가지 문제가 있네요.
다른 클래스를 상속한 클래스를 제대로 담을 수가 없네요.
예를들어,
Parent 클래스 타입의 객체를 담는 컨테이너 인스턴스를 만들었을 때
Parent 클래스를 상속한 Child 클래스 타입의 객체는 이 컨테이너에 제대로 적용이 안되요.
컨테이너에 들어가긴 하지만 Child 클래스로 적용되는게 아니라 Parent 클래스로 적용이 되네요.
그래서 Parent 클래스의 특성만 갖고, virtual 함수도 전부 Parent 함수로 실행되고요.
코드를 써본다면 이런 식이겠군요...
[geshifilter-code]template <typename T>
class List {
private: T data;
public: void Input(const T& object) {data= object;}
};
class Parent {
};
class Child : Parent {
};
int main(void) {
List<Parent> list;
Child chlid;
list.Input(chlid);
}
[/geshifilter-code]
이렇게 썼을 경우 list 인스턴스에는 Child 타입의 객체가 아닌 Parent 타입의 객체가 담겨요. ㅜ.ㅜ
템플릿에 자료 저장하는 멤버를 T가 아닌 T*로 잡아 봐도, 포인터로만 쓰면 괜찮지만, 컨테이너 내에서 (new T 방식으로) 동적 할당할 경우에는 T 타입 객체를 만드는 셈이라서 똑같은 문제가 생기네요.
이거 Parent, Child 모두 담을 수 있게 하려면 어떻게 해야 되나요?
복사되고 있으므로
복사되고 있으므로 당연합니다.
포인터로 쓰면 됩니다만, "컨테이너 내에서 (new T 방식으로) 동적 할당할 경우에는 T 타입 객체를 만드는 셈이라서 똑같은 문제가 생기네요." 라는 부분은 뭐가 문제가 되는건지 모르겠네요.
답변 감사합니다. ^^
List <Parent*> list;
이렇게 포인터형으로 인스턴스를 만들고 컨테이너 외부에서 동적할당해서 포인터만 넘기고 저장하면 되더군요.
다만 컨테이너 내부에서 동적할당을 처리하면 마찬가지로 T타입 객체를 생성하는거라 마찬가지더군요
컨테이너 내부에서 메모리 관리를 하도록 만들고 싶었는데,
그냥 외부에서 처리해야겠네요. ^^
포인터를 쓰면서
포인터를 쓰면서 메모리관리가 자동으로 되기를 원한다면 boost::shared_ptr을 이용하는 것도 고려해볼만 합니다.
아니면 뭐 포인터 전용으로 컨테이너를 만들수도 있겠습니다만, 이경우는 객체복사에 대해 좀 신경써야겠지요.
댓글 달기