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

如何重载operator[]以调用SpareArray类的insert方法?

实现方括号语法复用SpareArray的insert逻辑

这问题挺典型的——要让arr[100] = 1这种方括号赋值自动触发你现有的insert方法(还得保留里面的业务逻辑),直接返回元素引用肯定行不通:毕竟你的SpareArray支持“无穷大”索引,大部分位置本来就没有实际存储的元素,而且核心诉求就是复用insert里的逻辑对吧?

解决思路是用代理模式:让operator[]返回一个代理对象,当你给这个代理对象赋值时,它会自动调用原SpareArray的insert方法。具体实现如下:

代码示例

class SpareArray {
public:
    // 你的现有insert方法(保留原有业务逻辑)
    void insert(size_t index, int value) {
        // 这里是你原有的业务逻辑,比如索引合法性校验、稀疏数组扩容、日志记录等
        // ...
    }

    // 可选:如果需要支持读取元素,你应该有对应的获取方法
    int get(size_t index) const {
        // 实现获取指定索引元素的逻辑,比如返回默认值或抛异常(如果索引不存在)
        // ...
    }

    // 内部代理类,用于处理[]的赋值/读取操作
    class Proxy {
    private:
        SpareArray& parent_array;
        const size_t target_index;
    public:
        // 构造函数绑定父数组和目标索引
        Proxy(SpareArray& arr, size_t idx) 
            : parent_array(arr), target_index(idx) {}

        // 重载赋值运算符:赋值时自动调用insert
        Proxy& operator=(const int value) {
            parent_array.insert(target_index, value);
            return *this;
        }

        // 重载类型转换运算符:支持读取元素(如果需要的话)
        operator int() const {
            return parent_array.get(target_index);
        }
    };

    // 重载非const版本的operator[],返回代理对象
    Proxy operator[](size_t index) {
        return Proxy(*this, index);
    }

    // 可选:const版本的operator[],用于只读场景
    int operator[](size_t index) const {
        return get(index);
    }
};

工作原理

当你执行arr[100] = 1时:

  1. 首先调用arr.operator[](100),返回一个绑定了arr和索引100的Proxy对象;
  2. 接着调用这个Proxy对象的operator=(1),内部直接触发parent_array.insert(100, 1),完美复用你insert方法里的所有业务逻辑。

如果需要支持读取操作(比如int val = arr[100];),代理类里的operator int()会自动调用get方法完成读取;而const版本的operator[]直接返回元素值,适合只读场景。

内容的提问来源于stack exchange,提问作者Jacobian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:36:06