シンプルな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 _colour
std::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
。
this
0x0になる原因は何でしょうか?
編集:
各コンストラクター、メンバー初期化子(例Board::Tile::Tile() : _colour (Colours::NONE), _owner (nullptr){}
)ですべてが初期化されていると確信しています。ここで、NONEは透明な黒です。
また、デバッグ値の出力にあまり使用していないため、デバッガーについてはあまり熟練していません。