C++ でチェス ゲームを作成しようとしています。
基本クラスの gamePiece と派生クラスの rook があります。私の最初のアイデアは、gamePiece オブジェクトのベクトルを作成し、そこにさまざまなタイプの gamePiece (ルーク、クイーン、ポーン) をすべて挿入することでした。前回の質問で分かったように、それはできません。gamePiece ベクトルは基本クラス (つまり、gamePiece) オブジェクトしか取りません。
ただし、スマート ポインターやその他の手法が提案されました。すぐに試してみます。
しかし、以下の手法が機能しない理由についてはまだ興味があります。代わりに、gamePieces へのポインターのベクターを作成し、そのベクター内に派生オブジェクトへのポインターを格納しようとするとどうなるでしょうか?
vector<gamePiece *> vectorOfPointersToGamePieces;
vector<gamePiece *>::iterator itOfPointersToGamePieces;
たとえば、上記のベクター内の最初の位置に rook オブジェクトへのポインターを挿入するとします。最初に私がうまくいくかもしれないと思ったのは、この戦略でした:
vectorOfPointersToGamePieces.push_back( &(rook(1, "Rook", 'A', 1, "White", "Up") ) );
itOfPointersToGamePieces=vectorOfPointersToGamePieces.begin();
( * ( * (itOfPointersToGamePieces))).displayPieceInfo();
コンストラクターは正常に動作しているように見え、すべてが初期化されます。しかし、cout を使用してデータ メンバーの値を画面に表示すると、変数が空または初期化されているように見えます。彼らが姿を消したようです。
私の 2 番目のクラックは、このように、ルーク ポインターをゲームピース ポインターに動的にキャストしてから、ベクターに挿入することでした。
vectorOfPointersToGamePieces.push_back( dynamic_cast <gamePiece *> (&(rook(1, "Rook", 'A', 1, "White", "Up") ) ) );
しかし、それは上記とまったく同じ出力をもたらしました。空/初期化された変数。
3 回目の試行では、一歩下がって、より簡単な操作を試みました。ここでは、ルークへのポインターの代わりに、gamePiece へのポインターをベクターに挿入しようとしました。
vectorOfPointersToGamePieces.push_back( &(gamePiece(1, "Rook", 'A', 1, "White", "Up")) );
この 3 番目の操作でも問題がありました。表示操作を試みたときに、コンストラクターで初期化した一部の変数のみが保持されていました。
itOfPointersToGamePieces=vectorOfPointersToGamePieces.begin();
( * ( * (itOfPointersToGamePieces))).displayPieceInfo();
具体的には、int と char が保持され、適切に表示されました。しかし、文字列は空っぽで消えてしまいました。
私の戦略がうまくいかない理由について何か考えがある人はいますか?