質問させて頂きます。
線形リストを階層状に構成するプログラムを書いていますが
cUnitList
+---cUnit
+---cUnit
....
+---cUnit
cULList
+---cUnitList
+---cUnitList
....
+---cUnitList
これを実現するために、現在それぞれにクラスを書いて実現しています。
しかし、それぞれのメンバ関数の多くは
中身がほとんど同じなので
一つの線形リスト基底クラスを作り、それをそれぞれが継承して実現したいのですが。
継承の知識が不十分なためか、良い方法が分かりません。
下位用のRoot/End、あるいは上位用のPrev/Nextが
ある時はcUnit,ある時はcUnitListになり
基底クラスを書く場合、これを表現する方法が分かりません
どう書いたら良いのでしょうか?
よろしくお願いします。
開発ツール:VisualStudio2013 C++
OS:Win7
線形リストの基底クラス
Re: 線形リストの基底クラス
何をやりたいのかよくわかりませんが、Compositeパターンが使えませんか?
以下にC++の実装例があるので、検討してみてください。
http://www002.upp.so-net.ne.jp/ys_oota/ ... /index.htm
全然違う場合、もう少しやりたいことの説明が必要かと。
不完全でもよいので、ソースコードとか。
以下にC++の実装例があるので、検討してみてください。
http://www002.upp.so-net.ne.jp/ys_oota/ ... /index.htm
全然違う場合、もう少しやりたいことの説明が必要かと。
不完全でもよいので、ソースコードとか。
Re: 線形リストの基底クラス
早速のお返事ありがとうございます。
パラメータを複数持つノードのリストがあり、そのリスト自体も複数存在しているため
複数階の階層構造になってしまいました。
なのでcUnitの中にもパラーメータがたくさんぶら下がっています。
そして、似た線形リストがソース上に
たくさん散らばっていて、現在全部をベタ書きしてるのですが
ちょっとみっともないかなと思い。
基底クラスでAdd/AddRange/RemoveEnd/Clear/Root/End/Next/Prev
などの関数を一回書いて、あとは流用なんて出来たら便利だなと思って相談しました。
長くなってしまうので端折った定義部分だけですが
ソースを添付します。
パラメータを複数持つノードのリストがあり、そのリスト自体も複数存在しているため
複数階の階層構造になってしまいました。
なのでcUnitの中にもパラーメータがたくさんぶら下がっています。
そして、似た線形リストがソース上に
たくさん散らばっていて、現在全部をベタ書きしてるのですが
ちょっとみっともないかなと思い。
基底クラスでAdd/AddRange/RemoveEnd/Clear/Root/End/Next/Prev
などの関数を一回書いて、あとは流用なんて出来たら便利だなと思って相談しました。
長くなってしまうので端折った定義部分だけですが
ソースを添付します。
// ===================================================================== cUnitクラス
class cUnit
{
public:
cUnit()
{
_prev = NULL;
_next = NULL;
};
cUnit*& Prev(){ return _prev; }
void Prev(cUnit* prev){ _prev = prev; }
cUnit*& Next(){ return _next; }
void Next(cUnit* next){ _next = next; }
private:
cUnit* _prev;
cUnit* _next;
};
// ===================================================================== cUnitListクラス
class cUnitList
{
public:
cUnitList()
{
_root = new cUnit();
_end = _root;
// ---------------------- 以下上位向け
_prev = NULL;
_next = NULL;
}
void Add(cUnit* u);
void AddRange(cUnitList* p);
void RemoveEnd();
void Clear();
cUnit* Root(){ return _root; }
cUnit* End(){ return _end; }
// ---------------------- 以下上位向け
cUnitList*& Prev(){ return _prev; }
void Prev(cUnitList* prev){ _prev = prev; }
cUnitList*& Next(){ return _next; }
void Next(cUnitList* next){ _next = next; }
private:
cUnit* _root;
cUnit* _end;
int _size = 0;
// ---------------------- 以下上位向け
cUnitList* _prev;
cUnitList* _next;
};
// ===================================================================== cULListクラス
class cULList
{
public:
cULList() :
{
_root = new cUnitList();
_end = _root;
}
void Add(cUnitList* p);
void AddRange(cULList* p);
void RemoveEnd();
void Clear();
cUnitList* Root(){ return _root; }
cUnitList* End(){ return _end; }
private:
cUnitList* _root;
cUnitList* _end;
int _size;
};
Re: 線形リストの基底クラス
> 基底クラスでAdd/AddRange/RemoveEnd/Clear/Root/End/Next/Prev
> などの関数を一回書いて、あとは流用なんて出来たら便利だなと思って相談しました。
その後、進展はありますか?
Compositeパターンが使えると思うのですが、使えない理由があるのでしょうか。
> などの関数を一回書いて、あとは流用なんて出来たら便利だなと思って相談しました。
その後、進展はありますか?
Compositeパターンが使えると思うのですが、使えない理由があるのでしょうか。