私は単純なConnect 4ゲームを設計しています。これまでのところ、私は4つの基になるクラスを持っています:`this 'は0x0と同じで、私のプログラムがクラッシュするのはなぜですか?
Colour
- 色を表すのはRGBAです。変換演算子を含みます。
Player
- ゲームのプレイヤーを表します。各Player
にはColour
と名前があります。
Board
- 再生ボードを表します。これには寸法と、これらの寸法を持つTile
の2Dベクトルが含まれています。
Tile
- ネストされたクラスBoard
以内。ボード上の1つのスペースを表します。各Tile
は、そのタイルの所有者にColour
とstd::unique_ptr
を持ちます。所有者はnullptr
で始まり、をからPlayer
に一度変更することができます。色は透明な黒色で始まります。
私はColour
クラスをテストしましたが、正常に動作しているようです。私のPlayer
クラスもチップトップ型です。しかし、私はBoard/Tile
クラスにいくつか問題があります。
私のテストでは、2人のプレーヤーとボードを作成しました。これらは正常に実行されます。次に、各タイルに1回、ボードの寸法をループします。私はその後j
、あなたはそれを印刷することを期待したい方法でi
と行と列を通じて
board.tile (j, i).claimBy (p2);
ループが行くを呼び出します。
tile (j, i)
は、私が作業しているタイルを取得します。それは期待どおりに動作します。クラッシュをもたらす事象の
チェーン:
bool Board::Tile::claimBy (const Player &owner)
{
if (!_owner)
{
*_owner = owner;
_colour = owner.colour();
return true;
}
return false;
}
_owner
は私std::unique_ptr<Player>
次のとおりです。
claimBy (p2)
次のようにそれが実装されているプレイヤー2によって主張になるためにタイルを設定します。まず、タイルの所有者が以前に設定されているかどうかを確認します(つまり、nullptr
ではありません)。そうでない場合は、渡されたものの内側にPlayer
を設定します。次に、タイルの色を更新してtrue
を返します。タイルが以前に要求されている場合は、false
を返します。
デバッガに続いて、*_owner = owner;
という行でクラッシュが発生します。私は暗黙のコピーコンストラクタであることを覚えています(クラスは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()
はちょうどreturn _red;
あるred()
を持っています。これは、プログラムがクラッシュするポイントです。デバッガには、this
(this->_red
)が0x0であることが示されています。
なぜこれが起こっているのかはわかりません。私の最高の推測は、私が間違ってスマートポインタを使用しているということです。以前は実際に使用したことはありませんでしたが、普通のポインタとよく似ているはずです。ポインタがnullptr
の場合、release
は何も達成できませんでした。
this
が0x0の原因は何ですか?
編集:
私は、各コンストラクタで行うように私はどれも透明な黒ではないメンバー初期化子(例えばBoard::Tile::Tile() : _colour (Colours::NONE), _owner (nullptr){}
)、で、すべてが初期化されると確信しています。
私はデバッガに習熟していません。なぜなら、私はそれをデバッグ値を印刷する以上には使用していないからです。
サイドノート:タイルをボードにするのは本当に意味がありますか? – Cameron
@Cameronでは、is-a関係は継承に関係します。 'Tile'クラスの私の目標は、' Board'に完全に含めることでした。 'tile'関数はもともと' const'リターンでしたが、私はテストのためにそれを変更しました。タイルは「ボード」の外からアクセスできますが、新しいタイルは作成されず、作成されたばかりではありません。もちろん、「ボード」はタイルのベクトルを介して非constアクセスを持っています(私が提供する関係があります)。つまり、ボードオブジェクトにはタイルの2Dベクトルがあります。 – chris
デザインに関する無関係なコメント:ボードを操作するゲームロジックは、RGBAカラーに関わる必要はありません。私は、それをコントロールするプレイヤーを参照するだけで、どのプレイヤーに基づいて色を選択させるかを描画コードに任せます。 – Wyzard