我在为对象中的读取和写入重载operator []时遇到问题。这是一个包含不同组件的大型代码,我不打算将所有细节放在这里,因为它不会有用。简而言之,我所拥有的是以下内容
class MyObject(){
inline SetterProxy& operator[](int i) {
SetterProxy a(i);
return a;
}
inline double operator[](int i) const{
return some_value;
}
}
第一个重载[]适用于赋值(如果你想知道什么是SetterProxy,我必须使用Proxy类来分配值之前能够进行一些检查和内部函数调用)。但是,应该在读取时调用的第二个不起作用并且代码崩溃。我不确定这里发生了什么,但是当我发表第一个评论时,它运作正常!可能是编译器以某种方式混淆了两者,因为它们都是内联的吗?
任何想法都会受到赞赏。
编辑: 好的是SetterProxy本身:
class SetterProxy{
private:
Vec v;
int i;
double *ptr_val;
public:
inline SetterProxy(Vec v_, int i_) {
v = v_;
i = i_;
VecGetArray(v,&ptr_val);
}
inline ~SetterProxy(){
VecRestoreArray(v,&ptr_val);
}
inline void operator=(double rhs ){
ptr_val[i] = rhs;
}
};
虽然我不认为它直接来自那个。最初我还有它按价值返回,虽然我把它改成参考会更有效率。我认为这应该是安全的,因为赋值是在Proxy operator =()类中完成的,之后代理类超出了范围。无论哪种方式,这都不能解决我的问题!
答案 0 :(得分:10)
您正在返回对局部变量的引用 - 当操作符返回时,它会超出范围,让您的引用悬空。如果将警告设置提高到合理的水平,一个好的编译器应该警告你。
答案 1 :(得分:3)
如@Stuart Golodetz的回答所述,您将返回SetterProxy
引用a
的引用,该引用位于您的方法的本地,因此在返回时超出范围。
您应该按价值返回SetterProxy
实例:这不应该是一个大问题,SetterProxy
可能只保留索引和对“ parent“object,所以编译器生成的拷贝构造函数就可以了,副本也不会很昂贵。
顺便说一下,除非你想允许负面索引,否则通常的习惯用法是对数组中的索引使用size_t
。