이터레이터 관련, 클래스 설계에 대한 문의
제가 ROOT라는 C++ 라이브러리 상에서 돌아가는 라이브러리를 만들고 있는데요,
이 ROOT에는 기본 클래스로 만물의 부모 역활을 하는 TObject, 또 모든 컨테이너의 부모 역활을 하는 TCollection,
그리고 여러 컨테이너 클래스들의 이터레이터 부모 역활을 하는 TIterator, 이들 이터레이터들을 통일적으로
다룰 수 있게 해 주는 랩퍼 클래스인 TIter등이 있습니다.
class TObject { ...}; class TCollection : public TObject { ... }; class TIter { public: TIter(const TCollection *col); // ... private: TIterator *fIterator; };
TCollection의 파생 클래스로 TList, TObjArray, 등등이 있구요.
제 프로젝트에서는 TObject에 해당하는 TMyObject, TObjArray를 멤버 데이타로 가지는 TMyRecords를 정의했구요,
class TMyObject : public TObject { ...}; class TMyRecords : public TMyObject { ... protected: TObjArray fRecords; };
그리고 이들 클래스들로 파생된 많은 수의 클래스들을 만들었는데 현재 그럭 저럭 잘 돌아 갑니다.
근데 제 컨테이너 클래스들을 저 TIter로 호출하는게 문제네요.
TIterator로부터 상속받은 제 컨테이너 클래스들의 고유의 이터레이터를 만드는 건 잘 되었습니다.
한데
class TMyRecordsTypeA : public TMyRecords { ... } ; ... TMyRecordsTypeA *recs = new TMyRecordsTypeA(); ... TIter next(recs); // --> 여기서 에러
위처럼 하면 당연히 에러가 뜹니다. 이유는 TMyRecords가 TCollection으로부터 상속을 안 받았기 때문인데요,
여기서 어떻게 할 건지 현재 고민 중입니다. 현재 생각 중인 옵션은
1. TMyObject를 TObject가 아닌 TCollection으로 부터 상속받게 만든다,
즉 집합인 아닌 기본 자료도 크기가 0인 컨테이너 클래스로 구현한다.
안 해 봤지만 이렇게 하면 잘 돌아는 갈 것 같습니다.
단지 집합이 아닌 녀석들도 집합으로 구현한다는 게 맘에 걸리네요.
2, TIter에 해당하는 TMyIter 클래스를 만든다.
역시 안 해 봤지만 이것도 잘 돌아는 갈 것 같은데요,
우선 문제가 ROOT 사용자들이 TIter에 익숙한데 새로운 이터레이터인 TMyIter를 사용하게 해야 한다는
부담이 좀 있구요,
다른 문제로는
TIter가 다른 클래스들의 부모로 쓰여 질 것으로 가정된게 아니라서
멤버 함수들이 가상함수로 되어 있지 않습니다.
그래서
class TMyIter : public TIter {...};
형식으론 구현이 안될것 같고,
TIter 소스 파일을 통째로 카피해서
TIter 이름를 TMyIter로 바꿔서 쓰는 정도일텐데요,
이건 뭔가 (꼭 불법이 아니라고 하더라도) 나쁜 짓을 하는 것 같아 찝찝하네요.
예를 들어 Author란에 원 TIter 만든 사람의 이름을 붙일수도 없고 제 이름을 붙일수도 없고...
3. 한번도 안해본 다중 상속을 이번 기회에 배워 본다.
즉 TMyRecords를 TMyObject와 TCollection 이 둘로부터 상속받게 만든다.
이 경우의 문제는 제가 다중상속에 대해 완전 무지하다는게 문제네요.
어떻게 하는게 좋을까요 ?
댓글 달기