이터레이터 관련, 클래스 설계에 대한 문의

parkon의 이미지

제가 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 이 둘로부터 상속받게 만든다.
이 경우의 문제는 제가 다중상속에 대해 완전 무지하다는게 문제네요.

어떻게 하는게 좋을까요 ?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.