如何重载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时:
- 首先调用
arr.operator[](100),返回一个绑定了arr和索引100的Proxy对象; - 接着调用这个
Proxy对象的operator=(1),内部直接触发parent_array.insert(100, 1),完美复用你insert方法里的所有业务逻辑。
如果需要支持读取操作(比如int val = arr[100];),代理类里的operator int()会自动调用get方法完成读取;而const版本的operator[]直接返回元素值,适合只读场景。
内容的提问来源于stack exchange,提问作者Jacobian
相关产品推荐
相关产品推荐

