2013-03-08 3 views
0

прямо сейчас, я должен написатьПерегрузка операторов = и []

st[1]; 
st = 5; 

Что я должен изменить в своем коде, чтобы быть в состоянии сделать это:

st[1] = 5; 

#include <iostream> 
using namespace std; 
class A 
{ 
public: 
    A(){this->z = 0;} 
    void operator = (int t) { this->x[this->z] = t+10; } 
    int& operator [] (int t) { this->z=t; return this->x[t]; } 
private: 
    int x[2]; 
    int z; 
}; 
void main() 
{ 
    A st; 
    st[0]=9; 
    cout<<st[0]; 
    system("pause"); 
} 

UPD: Теперь я вижу 9 вместо 19.

+2

Верните свой int по ссылке для оператора [] –

+1

Верните ссылку из 'operator []'. Остерегайтесь того, что это нарушает инкапсуляцию значения, содержащегося в элементах, открытых таким образом полностью. – JoergB

+0

Я не совсем уверен, что вы думаете 'st [1];' делает. Несомненно, _doesn't_ выберите элемент массива 1 для следующего независимого оператора, если это то, что вы хотите. 'Й [1]; st = 5; 'и' st [1] = 5' - две совершенно разные вещи. – Damon

ответ

3

Встроенный оператор = ожидает lvalue как левый операнд. Поэтому, для того, чтобы это утверждение компиляции:

st[1] = 5; 

Вы должны изменить тип возврата вашего operator [] из int в int&:

int& operator [] (int t) { return this->x[t]; } 
// ^^^^ 

Вы могли бы также обеспечить перегрузку const, который будет возвращать ссылку на const, если объектом, на который вызывается operator [], является const:

int const& operator [] (int t) const { return this->x[t]; } 
// ^^^^^^^^^^      ^^^^^ 
+0

Нет смысла возвращать 'const &' из функции 'const', поскольку' int' достаточно мал, чтобы скопировать (хотя это должно быть оптимизировано, включено и фактически не имеет значения). –

+0

@AlexChamberlain: Ну, может быть точка. Если у меня есть ссылка, я могу увидеть изменения этого значения. Если бы я вернул значение, это было бы невозможно. Таким образом, клиент выбирает. Это все о семантике значений и семантике ссылок. –

+0

Я никогда не думал о том, чтобы держать ссылку, хотя это звучит так, будто она может легко болтаться. –