ページ 11

クラス配列のconstメンバ変数

Posted: 2011年11月09日(水) 23:13
by YYSS
こんにちは、C++でSTGを作っているものです。

敵・弾などをクラスで定義し、それを配列にしてオブジェクトの管理をしているのですが

コード:

class C_Enemy{

private:
      const int Index;

public:
      C_Enemy( int num ) : Index( num ){}

}

//実体作成
C_Enemy Enemy[1024]( ??? );
例として上記のクラスを定義し、実体を作るのですが、
constメンバである「Index」に自分の配列番号をいれたいのです。

定数にこだわらなければ、

コード:

class C_Enemy{

private:
      int Index;

public:
      C_Enemy(){}

      void SetIndex( int setNum ){     Index   = setNum;    }

}


//実体作成
C_Enemy Enemy[1024];

for( int i=0 ; i<1024 ; i++ ){

      Enemy[ i ].SetIndex( i );
}

とやればいいのですが、知らない間に値が変わるのを防ぎたいと思ったのでconst指定したのですが、
この方法は無理でしょうか?


アドバイスをいただけると幸いです。


~開発環境~
○Windows 7 Ultimate SP1
○Visual C++ 2010 Express
○DXライブラリ使用

Re: クラス配列のconstメンバ変数

Posted: 2011年11月10日(木) 00:49
by GRAM
こういうことができなくはないですが、お勧めはできません・・・

コード:

#include <iostream>

using namespace std;
class C_Enemy{
 
private:
      const int Index;
 
public:
      C_Enemy( int num ) : Index( num ){}
	void ShowNum(){
		cout << Index << endl;
	}
};


int main(){
	C_Enemy* p = (C_Enemy*)operator new( sizeof( C_Enemy ) * 1024 );
	for( int i = 0; i < 1024; ++i ){
		new( p + i )C_Enemy( i ); 
	}
	for( int i = 0; i < 1024; ++i ){
		p[i].ShowNum();
	}
	for( int i = 0; i < 1024; ++i ){
		p[i].~C_Enemy();
	}
	operator delete( p );

}
ベクタで管理することもできますが、コピーコンストラクタが呼び出されます

コード:

using namespace std;
class C_Enemy{
		
private:
      const int Index;
 
public:
	C_Enemy( const C_Enemy& other ):Index( other.Index ){
		cout << "Copy" << endl;
	}
    C_Enemy( int num ) : Index( num ){}
	void ShowNum(){
		cout << Index << endl;
	}
};


int main(){
	vector< C_Enemy > v;
	v.reserve( 1024 );
	for( int i = 0; i < 1024; ++i ){
		v.push_back( C_Enemy(i) );
	}
	for( int i = 0; i < 1024; ++i ){
		v[i].ShowNum();
	}
}
取り敢えず現時点ではこんな書き方しかできないかと・・・(ほかにあるかもしれませんが)

Re: クラス配列のconstメンバ変数

Posted: 2011年11月10日(木) 01:29
by tk-xleader
メンバにIndexを持つということは、他にこのクラスのオブジェクトは存在しない。と仮定してもいいのでしょうか?
もしそうだとすれば、次のように書くことはできます。

コード:

class C_Enemy;
extern C_Enemy Enemy[1024];//先に配列を宣言しておく、定義はまだしない。

class C_Enemy{
 
private:
      const int Index;
 
public:
      C_Enemy( ) : Index( this - Enemy ){}
 
};

C_Enemy Enemy[1024];//ココで実体を定義する。

Re: クラス配列のconstメンバ変数

Posted: 2011年11月10日(木) 11:39
by beatle

コード:

class C_Enemy{
 
private:
    const int Index;
 
public:
    C_Enemy( int num = -1 ) : Index( num ){}
 
};
 
//実体作成
C_Enemy Enemy[1024] = {
    C_Enemy(0),
    C_Enemy(1),
    C_Enemy(2),
};
こんなやり方もあります。

Re: クラス配列のconstメンバ変数

Posted: 2011年11月11日(金) 23:10
by YYSS
返答ありがとうございます。

簡単には出来ないということがわかったので、普通の変数でやりたいと思います。

ステージの開始時あたりで毎回設定するようにしたいと思います。

アドバイスありがとうございました