2

私は市松模様のデザインを検討しており、次のようなことをしたいと考えています。

typedef std::map <std::string, CheckerPiece> MapType;
MapType CheckerBoard;

CheckerBoard.insert({"a1", null});

これは許可されていますか、または同様のことを行う方法はありますか? アイデアは、CheckerPiece オブジェクトをある場所から別の場所に移動しながら、ボードの状態を維持したいということです。

編集: 同じように、次のことを行うことは可能ですか:

CheckerBoard.insert({"a1", new CheckerPiece()});
4

4 に答える 4

8

マップはポインターを保持しないため、ポインターを引数としてCheckerPiece受け取る暗黙のコンストラクターがない限り、実行しようとしているものはコンパイルされません。これは、では何も意味しないというCheckerPrice事実を無視しています。またはを意味すると仮定すると、それらのいずれか、またはの結果を挿入することはできませんnullC++NULLnullptr

new CheckerPiece()

あなたの地図に、ピリオド。上記の式は へのポインタを返しますCheckerPiece

C++ には、型の null 値の概念がありません (具体的に設計しない限り)。回避策は、オプションのセマンティクスを提供するラッパー タイプを使用することです。つまり、何かが「設定」されているかどうかを確認できます。一例はboost::optional です

テストされていない例を次に示します。

#include <boost/optional.hpp>

boost::optional<CheckerPiece> piece;

if (piece) {
  // piece is not set, we should never get here
}

piece.reset(CheckerPiece( constructor arguments...));

if (piece) {
  // piece is set, use it!
  piece.move();
}
于 2013-02-20T19:23:05.767 に答える
1

どのようにCheckerPiece見えますか?最も明白な解決策は、ピースの不在に対応する追加の可能性を追加することです。ピースには実際には何の動作もありません。ピース自体は必要ありません。実際に必要なのは、正方形の状態に関する情報だけです。つまり、赤、黒、または空であり、王冠が付いているかどうか (空の場合は無視されます)。

チェッカーボードを地図として維持することも、おそらく最も賢明な解決策ではないことを付け加えておきます。私は次のようなもので行きます:

CheckerPiece board[10][10];

(またはCheckerPiece board[N][N]N国際標準チェッカーだけでなく、ローカル バリアントをサポートする場合は、 はテンプレート引数です)。

于 2013-02-20T19:51:14.093 に答える
0

ボードの定義を変更します。

ボードまたはボードの状態は、 のコレクションです<checker piece, location>。このコンテナにないボード ポジションは空と見なされます。ボード状態にないチェッカーはすべてキャプチャされています。

この概念では、NULL チェッカー ピースは必要なく、NULL のチェッカー ピースを比較する必要もありません。

移動を計画するとき、または移動履歴を作成するときに、ボードの状態のコンテナーを使用できます。

特定のボード状態を使用してボードを描画する関数を作成することをお勧めします。これにより、ボード状態コンテナから移動ごとに実際のボードを表現しようとする問題が解消されます。

于 2013-02-20T20:19:20.977 に答える
0

ポインター/ヒープに割り当てられた CheckerPieces を使用する場合は、aCheckerPiece*ではなくa を使用するようにマップを定義する必要があります。C++ のように「ここにはオブジェクトがありません」という値はありませんCheckerPiecenullサードパーティのライブラリを使用せずにオプションのオブジェクトを示す標準的な方法は、ポインターを使用してnullptr、オプションの要素が存在しない場合にそれを設定することです。

boost::optionalサードパーティのライブラリを使用できない理由がない限り、CheckerPiece が特定の場所にある場合とない場合があることを示すためにおそらく使用します。

于 2013-02-20T19:24:02.320 に答える