動的配列の実装

  コンストラクタ と デストラクタ



  
メンバ変数として以下の変数を定義し、コンストラクタで初期化、デストラクタで終了処理を行います。
pArray には動的に確保したメモリのポインタをセットし、nSize には確保した int のサイズの個数
をセットします

void *pArray;
int nSize;
  

  
// *********************************************************
// コンストラクタ
// *********************************************************
Integer::Integer()
{
	nData = 0;
	pArray = NULL;
	nSize = 0;
}
// *********************************************************
// 拡張コンストラクタ ( 初期値設定 )
// *********************************************************
Integer::Integer( int a )
{
	nData = a;
	pArray = NULL;
	nSize = 0;
}

// *********************************************************
// デストラクタ
// *********************************************************
Integer::~Integer()
{
	if ( pArray != NULL ) {
		GlobalFree( (HGLOBAL)pArray );
	}
}
  



  添字オペレータの実装



  
// *********************************************************
// 動的配列の実装
// nIndex が 負の値の場合は 0 とみなします
// *********************************************************
int& Integer::operator[]( int nIndex )
{
	if ( nIndex < 0 ) {
		nIndex = 0;
	}
	if ( this->pArray == NULL ) {
		this->pArray = 
			GlobalAlloc(
				GMEM_FIXED | GMEM_ZEROINIT,
				(nIndex+1)*sizeof( int ) + 16
			);
		this->nSize = nIndex + 1;
	}
	else {
		if ( nIndex > this->nSize ) {
			void *pCopy;
			pCopy = 
				GlobalAlloc(
					GMEM_FIXED | GMEM_ZEROINIT,
					(nIndex+1)*sizeof( int ) + 16
				);
			memcpy( pCopy, this->pArray, this->nSize*sizeof( int ) );
			GlobalFree( (HGLOBAL)this->pArray );
			this->pArray = pCopy;
			this->nSize = nIndex + 1;
		}
	}

	return *(((int *)(this->pArray))+nIndex);
}
  
このオペレータの定義で重要なのは、型を int& で定義しているところです。
この & は、実体の参照を意味しますが通常のポインタとは違います。定義内では
実体そのものを指し示すので、左辺値として代入が可能となります。

以下に実行例を示します
  
Integer a;
int i;

a[5] = 123;

for( i = 0; i <= a.nSize-1; i++ ) {
	printf( "%d\n", a[i] );
}

a[10] = 123;

for( i = 0; i <= a.nSize-1; i++ ) {
	printf( "%d\n", a[i] );
}
  
デバッグ用に以下のメソツドを実装します
  
// *********************************************************
// 動的配列のコンソール表示
// *********************************************************
Integer::printArray()
{
	int i;

	for( i = 0; i <= this->nSize-1; i++ ) {
		printf( "%3d : %d\n", i, this->operator [] ( i ) );
	}
}
  

  
Integer a;

a[5] = 123;

a.printArray();

a[10] = 123;

a.printArray();
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ