c++:: 컨테이너 클래스 설계 문의
제가 클래스 설계 할 때 자주 겪는 어려움인데요,
상황은 이렇습니다.
ROOT라는 라이브러리를 쓰는데 여기에
TObject <- TCollection <- TSeqCollection <- TObjArray ...
등의 클래스들이 있습니다.
"<-" 기호는 상속 관계를 나타내고요.
여기서 제가 다루려고 하는 데이타들이 있는데
데이타 기본 유닛은 저 TObject로부터 상속받아 약간의 멤버 변수나 멤버 함수를
추가하면 딱 좋습니다.
예를 들어
class TMyObj : public TObject { public: // ... TMyObj* GetParent() const { return fParent; } private: TMyObj* fParent; }
근데 문제는 위의 TMyObj의 어레이를 위한 컨테이너 클래스들을 만들어야 하는데요,
정말 하고 싶은 건 TMyObj와 TCollection (혹은 다른 컨테이너 클래스)의 속성을 모두 가지고 싶은거죠.
근데 또 다중 상속이 어렵고 골치아프다고 하니
// 방법 1: class TMyObjArray1 : public TMyObj { //... private: TObjArray fArray; }; // 방법 2: class TMyObjArray2 : public TObjArray { //... TMyObj* GetParent() const { return fParent; } private: TMyObj* fParent; };
이 둘 중 하나를 선택해야될 듯 싶습니다.
현재 위 방법 1로 대충하고 있는데요, 문제는
ROOT에서 TIter라는 아주 일반적인 이터레이터를 제공하는데
이 TIter를 쓰려면 제 클래스들이 TCollection으로부터 상속받아야 되는군요.
물론 이터레이터가 아닌 방법으로 컨테이너 멤버들에 접근할 수 있는 길은 만들어 놨지만
아무래도 이터레이터를 제공하면 좋으니까
고민인게
TIter 소스 코드를 보면서 TMyIter라는 클래스를 만들어야 하는지
아니면
위의 방법 2를 선택해야 하는지 고민입니다.
위 방법2는 이터레이터 등등은 물론 문제 없지만
제가 다루려는 데이타 셋들의 속성(위의 예에서 GetParent())를 잘 주기 어려워
또 코드가 꼬이고 다른 문제들이 나타나는게 문제고요.
또 다른 방안 하나는 데이타 셋이 아닌 데이타 기본 유닛인 TMyObj를 아예
처음부터 TCollection으로 부터 상속받게 만들면 되긴 하는데
이건 뭔가 완전 꼼수/편법 같고 또 기억용량 등에서 불이익이 큽니다.
제 생각에는 다른 분들도 위와 비슷한 고민을 많이 하셨을 것 같은데
어떻게들 처리하시는 지, 혹시 뭔가 멋지고 쉬운 다른 방법이 있으신지
궁금해서 질문 글 올립니다.
입자물리학 그것도 큰실험쪽에서 일하시는 분같은데
입자물리학 그것도 큰실험쪽에서 일하시는 분같은데
그냥 내용은 TObject상속해서 만들어 놓고, TClonesArray로 root파일에 넣던지 하면 될것같은데 어떨까요?
데이타의 계층구조가 단순하면 말씀하신대로 하면 될것
데이타의 계층구조가 단순하면 말씀하신대로 하면 될것 같은데요,
어쩌다보니 피라미드형 다단계 구조를 다루게 되었고
또 한두가지 원하는 일을 처리하는게 아니라 범용 라이브러리를 만들려다 보니
머리가 좀 복잡해 졌습니다.
근데 제가 지금까지 TObjArray만 생각했었고 TClonesArray를 쓸 생각을 못했었군요.
말씀 감사드립니다... ^^
원하시는 답이 아닐지도 모르지만.
- 부모의 주소를 받아서 사용.
- 변수명을 다르게해서 부모 변수 사용.
- 클래스보다 함수로 만들경우가 더 편합니다.
메모리(데이터)와 함수(기능)' 두가지면 되거든요.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
현재 제 경우 기본 데이타 element와 이들의
현재 제 경우
기본 데이타 element와 이들의 컨테이너 클래스, 또 이들 컨테이너 클래스들의 컨테이너 클래스, ...,
이렇게 되어 있는데
기존 라이브러리의 이터레이터를 계속 사용할 수 있으면서 동시에
이들 모두(즉 기본 유닛과 다른 컨테이너 클래스들 모두)에게 GetParent()와 같이
새로운 공통된 메쏘드를 부여하는것이 좀 어려워서요.
근데 이렇게 제가 설명하는 말이 꼬이는 걸 보면
제가 아직 제 일을 제대로 잘 이해하지 못한것 같기도 하구요.
답변 감사드립니다...^^
댓글 달기