我正在尝试用 C++ 构建一个国际象棋游戏。
我有一个基类 gamePiece 和一个派生类 rook。我最初的想法是创建一个 gamePiece 对象的向量,并在其中插入所有不同类型的 gamePieces(车、皇后、棋子)。正如我在上一个问题中发现的那样,我不能这样做——gamePiece 向量只接受基类(即gamePiece)对象。
但是,建议使用智能指针和其他技术。我会尽快尝试的。
但我仍然很好奇为什么下面的技术不起作用。如果我改为创建一个指向 gamePieces 的指针向量,然后尝试将指向我的派生对象的指针存储在该向量中会怎样?
vector<gamePiece *> vectorOfPointersToGamePieces;
vector<gamePiece *>::iterator itOfPointersToGamePieces;
例如,假设我在上述向量的第一个位置插入一个指向车对象的指针。最初我认为可能有用的是这个策略:
vectorOfPointersToGamePieces.push_back( &(rook(1, "Rook", 'A', 1, "White", "Up") ) );
itOfPointersToGamePieces=vectorOfPointersToGamePieces.begin();
( * ( * (itOfPointersToGamePieces))).displayPieceInfo();
构造函数似乎运行良好,一切都初始化了。但是当需要使用 cout 在屏幕上显示数据成员的值时,变量似乎是空的/未初始化的。就像他们消失了一样。
我的第二次破解是尝试在将车指针插入向量之前将其动态转换为游戏指针,就像这样。
vectorOfPointersToGamePieces.push_back( dynamic_cast <gamePiece *> (&(rook(1, "Rook", 'A', 1, "White", "Up") ) ) );
但这产生了与上面完全相同的输出。空/统一变量。
在我第三次尝试时,我退后一步,尝试了一个更简单的操作。在这里,我尝试在向量中插入指向 gamePiece 的指针,而不是指向 rook 的指针。
vectorOfPointersToGamePieces.push_back( &(gamePiece(1, "Rook", 'A', 1, "White", "Up")) );
即使是第三个操作也存在问题——当我尝试显示操作时,只保留了我在构造函数中初始化的一些变量:
itOfPointersToGamePieces=vectorOfPointersToGamePieces.begin();
( * ( * (itOfPointersToGamePieces))).displayPieceInfo();
更具体地说,整数和字符被保留并正确显示。但弦是空的,消失了。
任何人都知道为什么我的策略不起作用?