よろしくお願いいたします。
実験的に、サーバーで対戦型オセロの実装を行なっています。
クライアントは複数人で2人一組のペアが揃った時点で、ゲームを開始することとします。
その際、ペアの分だけオブジェクトを動的に、生成しゲーム終了時や、エラーが発生し
終了せざる得ない場合など、オブジェクトを破棄することとします。
生成するオブジェクトを複数生成するのにどのような技法が使えますでしょうか
ご教示願います。
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
// 盤面クラス
class Board {
int size;
vector< vector<int> > Array;
// コンストラクタ
Board() : size(8)
{
// resize
Array.resize( size );
for(int i = 0; i<size; ++i){ Array[i].resize( size ); }
// set
for(int i=0; i< size;i++) {
for(int j=0; j<size; j++) {
Array[i][j] = 0;//(i+1)*(j+1);
}
}
}
// デストラクタ
~Board(){}
public:
void SetBoard(int x, int y) { Array[x][y]; };
int GetBoard(int x, int y) { return Array[x][y]; };
};
int main () {
Board *pBoard1 = new Board;
Board *pBoard2 = new Board;
// 複数オブジェクトを作成しスマートに管理したい
delete *pBoard1;
delete *pBoard2;
return 0;
}
普通にこれでよくない?
vector<Board> boards;
newとdeleteを外に出したいならば
vector<Board*> boards;
Boost 使ってよいのなら shared_ptr かな?
#include <boost/shared_ptr.hpp>
int main() {
typedef boost::shared_ptr<Board> BoardPtr;
BoardPtr pBoard1(new Board);
BoardPtr pBoard2(new Board);
// 通常のポインターみたいにアロー演算子が使える
pBoard1->HooBar();
// スコープアウト時にどこからも参照されなくなったら自動的にdeleteされる
}
もしくは Boehm GCとか?
Boehm GCはガベージコレクタで、用はどこからも参照されなくなったオブジェクトを自動
的に破棄してくれます。
詳しくはぐぐってみてください。
たいちろうさん、nowhreさんお世話になります。
たいちろうさんへ
>>vector<Board> boards;
Boardクラスをvectorで管理するアイデアですね、参考にさせて頂きます。
>>newとdeleteを外に出したいならば
>>vector<Board*> boards;
ごめんなさい、読解力がなくて
「newとdeleteを外に出したいならば」の解釈ですがnewやdelete関数を使う場合と理解
して、いいでしょうか?
nowhreさんへ
>>Boost 使ってよいのなら shared_ptr かな?
Boostの経験は少ないですが、参考にさせていただきます。
処で、実際オブジェクトを生成する際
vector<Board> boards1;
vector<Board> boards2;
とか
BoardPtr pBoard1(new Board);
BoardPtr pBoard2(new Board);
このような使い方になるのですが、この時に”boards1”とか”pBoard1”という
オブジェクトを、オブジェクト指向っぽく、生成する手法があれば、ご教示願いたいの
ですが。
Cの発想しかないので
int nPair; // ペアの番号
switch ( nPair ) {
case 1:
vector<Board> boards1;
break;
case 2:
vector<Board> boards2;
break;
}
こんな貧相なアイデアしか、思い浮かびません・・・・・orz
「オブジェクト指向っぽく生成する」が理解できません。
επιστημηさんお世話になります
>>「オブジェクト指向っぽく生成する」が理解できません。
うまく伝わりませんでした、ごめんなさい
switch文を用いずに、Boardオブジェクトを複数、複製する方法はないでしょうか。
Board* boards = new Board[2]; ぢゃダメなんすか?
pair<Board,Board> pair_of_board; とか。
>>vector<Board*> boards;
ごめんなさい、読解力がなくて
「newとdeleteを外に出したいならば」の解釈ですがnewやdelete関数を使う場合と理解
して、いいでしょうか?
元のソースにnewやdeleteがあったから書きました。
vectorでなく配列で管理する場合にも、
Board boards[MAX];と
Board *pBoards[MAX];という2通りの方法があり一長一短があると思います。
晴天さんのケースではどちらが良いか分かりませんので、
普通にvectorでインスタンスを管理する方法と、
インスタンスへのポインタを管理する方法の両方を書いたのです。
> vector<Board> boards1;
> vector<Board> boards2;
ペアの数だけBoardが必要なのであって、vector<Board>は1つで良いと思っていたのですが。
> オブジェクトを、オブジェクト指向っぽく、生成する手法があれば、ご教示願いたいの
> ですが。
このケースでどうしたら良いかは、何をしたいのかが情報不足。
一般論としてどうしたら良いかなら、デザインパターンの勉強でもしてみてはどうでしょう。
CPareクラスをつくって
Board Board1;
Board Board2;
の2つをメンバ変数にもつ
ペアができたら、CPareを生成する
ってのはどうでしょう?
>実験的に、サーバーで対戦型オセロの実装を行なっています。
その前にコンピュータVS人で作ってみる。