0

すべての動きが有効である必要があるため、ボードゲームを作成しようとしています。そのため、ボードのコピーを作成して動きを作り、その動きが有効かどうかを確認できるようにします。

まず、ボード上のすべての位置を 0 に初期化します (ボード全体を繰り返し、すべての p を 0 に設定します

 pair<int, int> p(y, x); 
 board_[p] = 0;

これがコピーボード方式

void Board::copy(Board & gb) {
for (int y = MIN_Y; y <= MAX_Y; ++y) {
    for (int x = MIN_X; x <= MAX_X; ++x) {
        pair<int, int> p(y, x); 
        if (gb.board_.at(p) != 0) {
            board_[p] = new Pieces(*gb.board_.at(p));  // **where I am confused**
        } else {
            board_[p] = 0;
        }   
    }
}
}

ボードの私のコンテナは次のとおりです。

map<pair<int,int>, Pieces*> board_;

プレイ方法では、ボードのコピーを作成します

unsigned int play(Board & b){
   b.copy(*this);
}

私の質問:両方

board_[p] = new Pieces(*gb.board_.at(p)); //Pieces is a class I defined

board_[p] = gb.board_.at(p);

エラーや警告なしでコンパイルします。どちらを使用すればよいですか?

4

5 に答える 5

1

これは浅いコピーです:

board_[p] = gb.board_.at(p);

これは深いコピーです:

board_[p] = new Pieces(*gb.board_.at(p));

最初のものはポインタをコピーするだけなので、のピースをboard_変更すると、の同じピースも変更されgb.board_ます。2つ目は実際にデータをコピーするため、変更は分離されます。

どちらを使用するかは、アプリケーションによって異なります。変更を伝播する場合は、浅いコピーを行います。それ以外の場合は、ディープコピーが必要になります。

コードスニペットにより、深刻なメモリリークのリスクがあるように見えることに注意してください。あなたはnew作品を作成していますが、決してdeleteそれらを作成していません。

于 2013-02-19T22:39:49.387 に答える
1

どちらも正しいかもしれませんが、おそらく最初のものが必要です。1 つ目は、各Piecesオーバーを新しいボードにコピーします。これは、ディープ コピーとして知られています。2 番目は、それぞれのオーバーへのポインターのみをコピーするPiecesため、両方のボードが同じセットを指しPiecesます。これは浅いコピーです。

ただし、ここにはもっと大きな問題があります。あなたは関数を定義していcopyますが、C++ はこれを行うための言語機能、つまりコピー コンストラクターを提供します。代わりに、次のように関数を定義する必要があります。

Board::Board(const Board& other_board) {
  // Copy everything from other_board to this board
}

そして、次のように使用します。

Board board;
Board newBoard(b);
于 2013-02-19T22:42:26.777 に答える
0

オリジナルを変更したくないので、ディープコピーが必要です。2つ目は浅いコピーです。したがって、最初のものが必要になります。

于 2013-02-19T22:39:57.463 に答える
0

したがって、board_[p] は Pieces へのポインタになることができますか?

それなら最初のが正解です。2番目のものはピースID番号です(私の理解では、実際に割り当てようとしたポインターではありません)。

于 2013-02-19T22:37:47.607 に答える
0

1 つ目はディープ コピー、つまりオブジェクトのコピー (クローン作成) を作成し、2 つ目は浅いコピー (オブジェクトへのポインターのコピー) を作成します。後者の場合、オブジェクトの同じインスタンスへの参照を持つボードが必要になりPieceます。これに関する問題は、ボードの 1 つがピースを削除すると、もう 1 つのボードがぶら下がっているメモリを指すことです。

于 2013-02-19T22:42:58.593 に答える