You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:33:00