c++ - 为读和写重载运算符 []

标签 c++ operator-overloading

我在重载 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/

相关文章:

c++ - 返回对临时 C++ 的引用

C++ 标准 : is there a result object?

c++ - 来自多个数据源的时间

c++ - 两次使用 cin 时的意外行为

c++ - C++ 中的继承成本

c++ - 初始化、复制构造函数和赋值

c++ - 请解释一下这个好友声明是什么意思?

C++ 重载相等运算符。我应该编写我的函数来接受通过引用或值传递的参数吗?

c++ - 重载运算符 delete 可以有默认参数吗?

c++ - 为模板类重载友元运算符<<