我在重载 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=() 类中完成的,之后代理类超出范围。无论哪种方式,这都不能解决我的问题!
最佳答案
您正在返回对局部变量的引用 - 当运算符返回时它超出范围,使您的引用悬空。如果您将警告设置设置为合理的级别,一个好的编译器应该就此警告您。
关于c++ - 为读和写重载运算符 [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8393059/