C++を用いたクラス型2次元配列の一括処理について
Posted: 2013年12月13日(金) 05:03
こんばんは、数年ぶりに利用させて頂きます。
プログラミング暦はCとJavaを趣味で数年齧った程度で、CとDXライブラリで2DSTGを作成したこともあります。
さて、現在、C++とDXライブラリを利用したゲーム作成を行っておりまして、その準備として
必要な機能のテストを行っているところなのですが、表題のように
「何名所属するかわからない団体が複数あり、団体ごとに所属者数を変えたり何名所属していても特に気にせず利用でき、
その上で全ての団体に対し、各団体の全所属者に対してまとめて処理を行いたい」
と考えております。
団体数は2から4のみ存在するものとし、開発は自分のみで行う予定です。
試行錯誤の結果、下記コードの形で上記条件を達成できたと考えております。
しかし、C++にはあまり慣れていないもので、
・vectorなどの使い方が今回の条件を満たすのにふさわしいのか
・団体数も可変長にできるのでは
・ソースの書き方自体にツッコミ所はないか
(名称の付け方、カプセル化、値の渡し方、new deleteのタイミングなど)
・もっといいやり方があるのでは
といった点などについて、皆様のご意見を頂けないでしょうか。
当初はvector<vector<CMember> > CGroupといった形で処理しようとしたのですが、
どうしてもうまくいかず、下記の形になりました。
可能であれば、団体を更に統括する大団体を作成し、それに対して一括で処理ができれば
なお理想的ではあります。
実行環境はWindows7 32bit VC++2008EE になります。
以上、宜しくお願い致します。
プログラミング暦はCとJavaを趣味で数年齧った程度で、CとDXライブラリで2DSTGを作成したこともあります。
さて、現在、C++とDXライブラリを利用したゲーム作成を行っておりまして、その準備として
必要な機能のテストを行っているところなのですが、表題のように
「何名所属するかわからない団体が複数あり、団体ごとに所属者数を変えたり何名所属していても特に気にせず利用でき、
その上で全ての団体に対し、各団体の全所属者に対してまとめて処理を行いたい」
と考えております。
団体数は2から4のみ存在するものとし、開発は自分のみで行う予定です。
試行錯誤の結果、下記コードの形で上記条件を達成できたと考えております。
しかし、C++にはあまり慣れていないもので、
・vectorなどの使い方が今回の条件を満たすのにふさわしいのか
・団体数も可変長にできるのでは
・ソースの書き方自体にツッコミ所はないか
(名称の付け方、カプセル化、値の渡し方、new deleteのタイミングなど)
・もっといいやり方があるのでは
といった点などについて、皆様のご意見を頂けないでしょうか。
当初はvector<vector<CMember> > CGroupといった形で処理しようとしたのですが、
どうしてもうまくいかず、下記の形になりました。
可能であれば、団体を更に統括する大団体を作成し、それに対して一括で処理ができれば
なお理想的ではあります。
実行環境はWindows7 32bit VC++2008EE になります。
以上、宜しくお願い致します。
#include <iostream>
#include <vector>
using namespace std;
class CMember{ //所属者クラス
private:
int x,y;
public:
CMember(){ x=y=0; }
void Init(int i){ //初期化は適当
x=rand();
y=2*i;
}
void Exec(vector<CMember>& A){ //処理内容も仮のもの
static int j = 1;
cout << "-------------" << endl;
cout << "count:" << j << endl;
cout << "-------------" << endl;
for(unsigned int i=0; i < A.size(); i++){
cout << "No." << i << endl;
cout << "x=" << A[i].x << ",y=" << A[i].y << endl;
cout << "x*y = " << A[i].x * A[i].y << endl;
cout << "-------------" << endl;
}
j++;
cout << endl;
}
};
class CGroup{ //団体クラス
private:
vector<CMember> Members; //所属者が何名でも対応できるようにvector
public:
void SetMembers(vector<CMember>& A){ Members=A; }
vector<CMember> GetMembers(){ return Members; }
};
int main(){
unsigned int num = 4; //団体数
unsigned int num2 = 6; //所属数
CMember* A; //所属者
A = new CMember[num2];
CGroup* X; //団体
X = new CGroup[num];
vector<CMember>* Buf; //バッファ
Buf = new vector<CMember>[num];
for(unsigned int i=0; i<num; i++){ //実際は、初期化・団体への所属数は各々異なる
for(unsigned int j=0; j<num2; j++){ //ここでは面倒なのでループさせている
A[j].Init(j*(i+1));
Buf[i].push_back(A[j]);
}
X[i].SetMembers(Buf[i]);
}
delete[] Buf;
for(unsigned int i=0; i<num; i++){ //全団体に対して行う
X[i].GetMembers().at(0).Exec( X[i].GetMembers() ); //各団体の所属者全てを一括で処理
}
delete[] X;
return 0;
}