C++如何为对象矩阵重载+=运算符并判断元素所属子类类型
问题解答
1. Tabla类+=运算符重载实现
Tabla构造函数初始化的n×n指针矩阵初始状态下所有元素都是空指针nullptr,按行优先遍历找到第一个空位置存入传入的Polje指针即可,矩阵满时可直接忽略传入参数(也可根据需求抛出容量不足的异常)。
将以下重载函数加入Tabla类的public成员即可:
Tabla& operator+=(Polje* p) { // 行优先遍历找首个空闲位置 for (int i = 0; i < dim; i++) { for (int j = 0; j < dim; j++) { if (mat[i][j] == nullptr) { mat[i][j] = p; return *this; } } } // 矩阵已满无空闲位置,可自行添加异常抛出逻辑 return *this; }
2. 判断Polje元素实际所属子类的两种方法
因为基类Polje本身包含虚函数,满足多态条件,有两种常用方案可以判断实际子类类型:
方案1:使用RTTI的dynamic_cast做向下转型
直接对Polje指针做向下转型,转型返回非空则说明是对应子类类型:
// 示例:判断GetPolje返回的指针实际类型 Polje* ptr = tabla.GetPolje(0,0); if (dynamic_cast<Voda*>(ptr) != nullptr) { // 实际为Voda类对象 } else if (dynamic_cast<Zemlja*>(ptr) != nullptr) { // 实际为Zemlja类对象 }
注意:部分编译环境默认关闭RTTI,需要手动开启编译选项才能使用该方案
方案2:基类新增类型标识虚函数(无需RTTI)
给基类Polje新增纯虚的类型查询函数,两个子类分别重写返回自身类型标识即可,兼容性更好:
// 给Polje类添加public成员 virtual const char* GetType() const = 0; // Voda类重写 const char* GetType() const override { return "Voda"; } // Zemlja类重写 const char* GetType() const override { return "Zemlja"; } // 使用示例 if (strcmp(ptr->GetType(), "Voda") == 0) { // 是Voda类 }
内容的提问来源于stack exchange,提问作者A_Mel
相关产品推荐
相关产品推荐

