テンプレート配列クラス

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

テンプレート配列クラス

投稿記事 by zxc » 12年前

  テンプレートな配列クラスを本を参考に作ってみた、なんだかちょっとややこしい。
  まずT型のクラス作って、次に「コードサイズ膨張を避けるために」特殊化クラスを親クラスとして、特殊化クラスを作るべきらしい。  基底となるクラスでデータの構造やら簡単なアクセスやらを決めて、クラスで一般向けに整形する( = はインターフェイス )と言う解釈でいいのか。どこで型の情報を保持すべきか否か正直よくわからない。
 クラスを使った時に見えてしまう部分、アクセスできる部分は型を適切にするようにはしたつもり。

CODE:

////array.h/////////////////
#include


////////配列クラス
template
class My_array{
	private:
		T* t;
		unsigned index;
	public:
		My_array();
		My_array(unsigned index_value):index(index_value){}
		My_array(T* tt,unsigned index_value):t(tt),index(index_value){}

///個々の配列要素へのアクセス
		T& operator[](unsigned  num ){
			assert( index の基底クラスとなる特殊化配列クラス
template 
class My_array{
	private:
		void** vpp;
		unsigned index;

	public:
		My_array();
		My_array(unsigned index_value):index(index_value){}
		My_array(void** tt,unsigned index_value):vpp(tt),index(index_value){}
///個々の配列要素へのアクセス
		void*& operator[](unsigned  num ){
			assert( index  
//このクラスの実態は配列クラスのインターフェイスである
template 
class My_array:private My_array{

	public:
		typedef My_array Base;
		My_array():Base(){}
		My_array(unsigned i):Base(unsigned i){}
		My_array(T** tt,unsigned index_value):vpp( tt ),index(index_value){}

///個々の配列要素へのアクセス
		T*& operator[](unsigned i){
			return static_cast( Base::operator[](i) );
		}

///配列の先頭と長さ(要素数)のコピー   
		T*& operator=(T*& tp){
			static_cast( Base::operator[](0) ) = tp; 
			return static_cast( Base::operator=(tp) );
		}

///配列の長さを返す関数はBaseから継承している
};
  配列をクラスのメンバとして持てたらいいかなぁ、と思い作ったが、ここまでの手間を考えると個々のクラスが、ポインタの処理を行うほうが良かったかもしれない。範囲外アクセスの例外も追加しないと不安。

naohiro19
記事: 256
登録日時: 14年前

Re: テンプレート配列クラス

投稿記事 by naohiro19 » 12年前

そんなことをしなくてもBoost.Arrayで代用可能です。

アバター
usao
記事: 1889
登録日時: 12年前

Re: テンプレート配列クラス

投稿記事 by usao » 12年前

これって実際どうつかうんですか?

MyArray Instance; //とかいう時点で間違っているのかな
//この後Instanceをどう用いるのかが?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前

Re: テンプレート配列クラス

投稿記事 by h2so5 » 12年前

20行目でローカル変数の参照を返しているのはマズイですね。

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

Re: テンプレート配列クラス

投稿記事 by zxc » 12年前

naohiro19 さんが書きました:そんなことをしなくてもBoost.Arrayで代用可能です。
  やっぱり配列関連もBoost万能ですね。
usao さんが書きました:これって実際どうつかうんですか?

MyArray Instance; //とかいう時点で間違っているのかな
//この後Instanceをどう用いるのかが?
  本では一部省略されている部分を適当に作ったので、機能を絞って色々変更すべき箇所があると思います。一応下のように使えますが要らないですし・・・

CODE:

	int arr[10]={0,1,2,3,4,5,6,7,8,9};
	My_array a(arr,10);
	cout<<a[3]<<endl;
h2so5 さんが書きました:20行目でローカル変数の参照を返しているのはマズイですね。
  修正しました。ご指摘ありがとうございます。