ページ 11

線形リストの基底クラス

Posted: 2016年5月19日(木) 14:13
by りるじ
質問させて頂きます。

線形リストを階層状に構成するプログラムを書いていますが
cUnitList
+---cUnit
+---cUnit
....
+---cUnit

cULList
+---cUnitList
+---cUnitList
....
+---cUnitList

これを実現するために、現在それぞれにクラスを書いて実現しています。

しかし、それぞれのメンバ関数の多くは
中身がほとんど同じなので

一つの線形リスト基底クラスを作り、それをそれぞれが継承して実現したいのですが。
継承の知識が不十分なためか、良い方法が分かりません。

下位用のRoot/End、あるいは上位用のPrev/Nextが
ある時はcUnit,ある時はcUnitListになり
基底クラスを書く場合、これを表現する方法が分かりません
どう書いたら良いのでしょうか?
よろしくお願いします。

開発ツール:VisualStudio2013 C++
OS:Win7

Re: 線形リストの基底クラス

Posted: 2016年5月19日(木) 14:43
by たいちう
何をやりたいのかよくわかりませんが、Compositeパターンが使えませんか?
以下にC++の実装例があるので、検討してみてください。

http://www002.upp.so-net.ne.jp/ys_oota/ ... /index.htm


全然違う場合、もう少しやりたいことの説明が必要かと。
不完全でもよいので、ソースコードとか。

Re: 線形リストの基底クラス

Posted: 2016年5月19日(木) 15:11
by りるじ
早速のお返事ありがとうございます。
パラメータを複数持つノードのリストがあり、そのリスト自体も複数存在しているため
複数階の階層構造になってしまいました。
なので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: 線形リストの基底クラス

Posted: 2016年5月24日(火) 10:06
by たいちう
> 基底クラスでAdd/AddRange/RemoveEnd/Clear/Root/End/Next/Prev
> などの関数を一回書いて、あとは流用なんて出来たら便利だなと思って相談しました。

その後、進展はありますか?
Compositeパターンが使えると思うのですが、使えない理由があるのでしょうか。

Re: 線形リストの基底クラス

Posted: 2016年5月27日(金) 13:31
by りるじ
お返事ありがとうございます。
Compositeパターン調べてみます。

Re: 線形リストの基底クラス

Posted: 2016年5月27日(金) 13:32
by りるじ
GoFはまだあまり分かってないのが多いので、この件一旦解決として、分からなかったらまた別途お願いします。