【发布时间】:2013-02-03 10:38:42
【问题描述】:
我正在尝试用 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();
更具体地说,整数和字符被保留并正确显示。但是字符串是空的,消失了。
有人对我的策略为什么不起作用有任何想法吗?
【问题讨论】:
标签: c++ inheritance vector