シンプルなConnect4ゲームをデザインしています。これまでのところ、4つの基礎となるクラスがあります。
Colour-色(RGBA)の表現を担当します。変換演算子が含まれています。
Player-ゲームのプレーヤーを表します。それぞれPlayerにColourと名前があります。
Board-プレイボードを表します。Tileこれには、次元と、それらの次元を持つsの2Dベクトルが含まれています。
Tile-内のネストされたクラスBoard。ボード上の1つのスペースを表します。それぞれTileに、そのタイルの所有者に対するとがありますColour。std::unique_ptr所有者はとして開始し、一度からnullptrに変更できます。色は透明な黒から始まります。Player
Colourクラスをテストしましたが、正常に機能しているようです。私Playerのクラスも最高の形をしています。ただし、Board/Tileクラスに問題があります。
私のテストは、2人のプレーヤーと1つのボードを作成することで構成されました。これらは正常に実行されました。次に、タイルごとに1回、ボードの寸法をループします。それから私は電話します
board.tile (j, i).claimBy (p2);
ループは、印刷されると予想される方法で、 行iと列を通過します。j
tile (j, i)作業中のタイルを取得します。期待どおりに動作します。
クラッシュにつながる一連のイベント:
claimBy (p2)プレイヤー2が要求するようにタイルを設定します。これは次のように実装されます。
bool Board::Tile::claimBy (const Player &owner)
{
if (!_owner)
{
*_owner = owner;
_colour = owner.colour();
return true;
}
return false;
}
_owner私のstd::unique_ptr<Player>です。最初に、タイルの所有者が以前に設定されているかどうか(つまり、設定されていないかnullptr)を確認します。そうでない場合は、Player内部を渡されたものに設定します。次に、タイルの色を更新して、を返しますtrue。タイルが以前に要求されている場合は、を返しますfalse。
デバッガーに続いて、クラッシュが行で発生します*_owner = owner;。ステップインすると、その行struct Player(クラスの宣言)に移動します。これは、暗黙のコピーコンストラクターであると見なされます(クラスにはaとaPlayerしかないことを思い出してください)。Colour _colourstd::string _name
もう一度ステップインすると、Colour::operator=(コピーコンストラクターが呼び出すのは理にかなっています)につながります。定義は次のとおりです。
Colour &Colour::operator= (const Colour &rhs)
{
if (*this != rhs)
{
_red = rhs.red();
_green = rhs.green();
_blue = rhs.blue();
_alpha = rhs.alpha();
}
return *this;
}
パスはに変わります*this != rhs。これは、の逆呼び出しoperator==です。つまり、次のようになります。
return red() == rhs.red()
&& green() == rhs.green()
&& blue() == rhs.blue()
&& alpha() == rhs.alpha();
ここでの最初の比較red() == rhs.red()はred()、これだけreturn _red;です。これは、プログラムがクラッシュするポイントです。デバッガーは、this(this->_red)が0x0であると述べています。
なぜこれが起こっているのか私にはわかりません。私の最善の推測は、私がスマートポインタを間違って使用しているということです。release私はこれまで実際に使用したことはありませんが、通常のポインターとかなり似ているはずであり、ポインターがである場合は何も達成できないと思いましたnullptr。
this0x0になる原因は何でしょうか?
編集:
各コンストラクター、メンバー初期化子(例Board::Tile::Tile() : _colour (Colours::NONE), _owner (nullptr){})ですべてが初期化されていると確信しています。ここで、NONEは透明な黒です。
また、デバッグ値の出力にあまり使用していないため、デバッガーについてはあまり熟練していません。