Оператор перегрузки [] для чтения и записи - PullRequest
0 голосов
/ 06 декабря 2011

У меня проблема с перегрузкой оператора [] для чтения и записи в моих объектах.Это большой код с различными компонентами, и я не собираюсь помещать здесь все детали, так как это не поможет.В двух словах, у меня есть следующее

class MyObject(){
    inline SetterProxy& operator[](int i) {
        SetterProxy a(i);
        return a;
    }
    inline double operator[](int i) const{            
        return some_value;
    }
}

Первый перегруженный [] прекрасно работает для присвоения значений (если вам интересно, что такое SetterProxy, я должен использовать прокси-классы, чтобы иметь возможность делать некоторыепроверка и внутренние вызовы функций перед присвоением значений).Однако второй, который должен быть вызван при чтении, не работает и код вылетает.Я не уверен, что здесь происходит, но когда я закомментирую первый, он просто отлично работает!Может ли быть так, что компилятор каким-то образом путает эти два, поскольку они оба встроены?

Любая мысль будет оценена.

РЕДАКТИРОВАТЬ: Хорошо, вот сам 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 ]

10 голосов
/ 06 декабря 2011

Вы возвращаете ссылку на локальную переменную - она ​​выходит из области видимости, когда оператор возвращается, оставляя вашу ссылку висящей.Хороший компилятор должен предупредить вас об этом, если вы установите настройку предупреждения на приемлемый уровень.

3 голосов
/ 06 декабря 2011

Как отмечается в ответе @Stuart Golodetz, вы возвращаете ссылку на SetterProxy, относящуюся к a, который является локальным для вашего метода и, следовательно, выходит из области видимости при его возврате.

Вам следуетвместо этого верните SetterProxy экземпляр по значению : это не должно иметь большого значения, SetterProxy, вероятно, просто будет содержать индекс и ссылку на "родительский" объект, поэтому сгенерированная компилятором копияконструктор для него будет в порядке, а копия вообще не будет дорогой.

Кстати, если вы не хотите разрешать отрицательные индексы, обычная идиома состоит в использовании size_t для индексов в массивах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...