c++ - 在讨论向量内的对象时,如何访问特定于派生类的方法和属性?
问题描述
我正在构建一个简单的国际象棋应用程序,我一直在发现一些问题。这是我的问题:
我有一个课件:
class Piece {
protected:
std::string name; // this is to store the piece's name (bishop, rook, etc.)
public:
Piece();
int positionX;
int positionY;
std::string getName();
};
我还有一个类 Board,它有一个 8x8 的 Pieces 矩阵:
class Board {
public:
// the construct fills the matrix with instances from Piece just so all matrix slots will have a piece
Board();
void showBoard();
std::vector<std::vector<Piece>> piece;
void place(Piece piece, char positionY, int positionX);
};
目前,我有一个包含 64 个通用棋子的棋盘对象。
现在,我创建了一个类 Rook,它继承自 Piece:
class Rook: public Piece {
private:
std::string color;
public:
Rook(std::string color);
std::string getColor();
bool isRook = true; // dummy attribute just to show you my problem
};
现在我尝试将我的车放在我的碎片矩阵中:
Board board;
Rook rook = Rook("white");
rook.positionX = 3;
rook.positionY = 0;
board.piece.at(rook.positionX).at(rook.positionY) = rook;
std::cout << board.piece.at(3).at(0).positionX << std::endl; // as expected, this outputs 3
最后,这是我的实际问题:
当我尝试访问只有 rook 拥有的东西,而不是其他部分时,例如 bool isRook,它会抛出一个错误,即 Piece 类没有属性 isRook:
std::cout << board.piece.at(3).at(0).isRook << std::endl; // this throws an error "class Piece has no attribute isRook"
我认为这是因为我有一个 Pieces 矩阵,所以我无法访问 Rooks 特有的东西。我该如何解决这个问题?
解决方案
问题是:要么使用多态性,要么不使用。介于两者之间的事情是可能的,但会增加复杂性。拥有一个基类指针容器并希望将对象作为子类访问是一种设计味道。您可以通过在基类中提供方法来修复它:
class Piece {
protected:
std::string name; // this is to store the piece's name (bishop, rook, etc.)
public:
Piece();
int positionX;
int positionY;
std::string getName();
bool isRook(); // all Pieces have a isRook()
virtual ~Piece(); // virtual destructor !
};
另请注意,Piece
缺少虚拟析构函数。最后但并非最不重要的一点是,您需要一个指针向量来利用多态性。目前你有对象切片。在这里阅读更多内容:为什么没有指针/引用就不能工作多态性?
推荐阅读
- azure - 如何将自定义命名空间添加到遥测事件
- reactjs - React 任务列表未正确更新
- mysql - 如何更新选择的读取计数?
- latex - 背页/乳胶:没有错误,干得好!+ 致命的语法错误
- haskell - Haskell函数中的整数与整数问题
- flowchart - 我可以控制美人鱼中流程图的方向吗?
- java - Android 工作室 - Firebase 调用上的 Java 空指针
- google-sheets - 如何根据值显示特定符号
- wpallimport - WP All Import - 使用自动生成的 SKU 导入更新数据
- python - 在 python 中使用 Projected Successive Overrelaxation Solver 实现 Crank Nicolson