線形リストの基底クラス

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
りるじ

線形リストの基底クラス

#1

投稿記事 by りるじ » 7年前

質問させて頂きます。

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

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

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

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

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

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

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

たいちう
記事: 418
登録日時: 13年前

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

#2

投稿記事 by たいちう » 7年前

何をやりたいのかよくわかりませんが、Compositeパターンが使えませんか?
以下にC++の実装例があるので、検討してみてください。

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


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

りるじ

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

#3

投稿記事 by りるじ » 7年前

早速のお返事ありがとうございます。
パラメータを複数持つノードのリストがあり、そのリスト自体も複数存在しているため
複数階の階層構造になってしまいました。
なので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;	
};		

たいちう
記事: 418
登録日時: 13年前

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

#4

投稿記事 by たいちう » 7年前

> 基底クラスでAdd/AddRange/RemoveEnd/Clear/Root/End/Next/Prev
> などの関数を一回書いて、あとは流用なんて出来たら便利だなと思って相談しました。

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

りるじ

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

#5

投稿記事 by りるじ » 7年前

お返事ありがとうございます。
Compositeパターン調べてみます。

りるじ

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

#6

投稿記事 by りるじ » 7年前

GoFはまだあまり分かってないのが多いので、この件一旦解決として、分からなかったらまた別途お願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る