重载operator []进行读写操作

时间:2011-12-05 22:53:19

标签: 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 =()类中完成的,之后代理类超出了范围。无论哪种方式,这都不能解决我的问题!

2 个答案:

答案 0 :(得分:10)

您正在返回对局部变量的引用 - 当操作符返回时,它会超出范围,让您的引用悬空。如果将警告设置提高到合理的水平,一个好的编译器应该警告你。

答案 1 :(得分:3)

如@Stuart Golodetz的回答所述,您将返回SetterProxy引用a的引用,该引用位于您的方法的本地,因此在返回时超出范围。

您应该按价值返回SetterProxy实例:这不应该是一个大问题,SetterProxy可能只保留索引和对“ parent“object,所以编译器生成的拷贝构造函数就可以了,副本也不会很昂贵。

顺便说一下,除非你想允许负面索引,否则通常的习惯用法是对数组中的索引使用size_t