自定义Array模板const对象可被修改问题求助
问题分析与解决
你的问题出在operator[]的实现上:当前你只写了一个const版本的operator[],但它返回的是可修改的T&引用,这就导致即使是const Array对象,也能通过这个引用修改内部数组的元素,完全违背了const对象的只读特性。
核心原因
在const成员函数中,this指针是const Array* const类型,意味着你不能修改类的成员变量(比如size_或者array_的指向),但array_是T*类型,它指向的内存区域在const成员函数中并没有被标记为只读——而你返回的T&直接允许外部修改这个区域的内容,所以const对象的约束被绕过了。
解决方案
你需要为operator[]提供两个重载版本:一个供非const对象使用(返回可修改引用),另一个供const对象使用(返回只读引用):
修改Array.tpp中的operator[]部分,替换为以下代码:
// 非const版本:供普通对象调用,允许修改元素 T& operator[](int n) { if (n < 0 || n >= size_) throw std::out_of_range("out of range"); return array_[n]; } // const版本:供const对象调用,仅允许读取元素 const T& operator[](int n) const { if (n < 0 || n >= size_) throw std::out_of_range("out of range"); return array_[n]; }
效果验证
修改后,当你尝试执行abc[0] = 3;时,编译器会直接报错——因为abc是const对象,它会调用const版本的operator[],返回的const int&不允许被赋值,完美符合const对象的只读预期。
另外,你的setValue成员函数也应该考虑const对象的情况:当前它是非const成员函数,const对象无法调用它,这是合理的,因为setValue本身就是修改操作,保持现状即可。
内容的提问来源于stack exchange,提问作者Doğuş Hamdi
相关产品推荐
相关产品推荐

