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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

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

#1

投稿記事 by YYSS » 8年前

こんにちは、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ライブラリ使用

アバター
GRAM
記事: 164
登録日時: 10年前
住所: 大阪

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

#2

投稿記事 by GRAM » 8年前

こういうことができなくはないですが、お勧めはできません・・・

コード:

#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();
	}
}
取り敢えず現時点ではこんな書き方しかできないかと・・・(ほかにあるかもしれませんが)

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

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

#3

投稿記事 by tk-xleader » 8年前

メンバに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];//ココで実体を定義する。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

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

#4

投稿記事 by beatle » 8年前

コード:

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),
};
こんなやり方もあります。

アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

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

#5

投稿記事 by YYSS » 8年前

返答ありがとうございます。

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

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

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

閉鎖

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