2013-06-12 2 views
1

Я сделал многочисленные поиски и нашли массу примеров и учебных пособий, но до сих пор не могу понять, как получить значение при записи оператора [] ...C++ перегрузить оператор [] для записи/комплект

I чувствую, что я схожу с ума. Должно быть, я что-то очень простое отсутствие

, насколько я могу сказать, есть одна функция для get и set, и это выглядит примерно так:

V& operator[](string K); 

или это:

double &operator[](int n); 

сейчас большой, мы можем получить то, что есть:

a[HERE] 

, как HERE становится double &operator[](int HERE); , и мы можем легко работать с ним

, но как же мы получим, что:

a[4] = HERE 

C есть # два очень ясно получить и установить методы с ключевым значением который представляет назначаемый объект.

public string this[int key] 
{ 
    get 
    { 
     if(key == 1) 
      return "1!"; 
     if(key == 2) 
      return "2!"; 
     else 
      return "3!"; 
    } 
    set 
    { 
     if(value == "setting") //value is a[3] = THIS 
      this.isSet = true; 
    } 
} 
+0

Что вы спрашиваете? – juanchopanza

+2

Вы не получаете правильную сторону назначения по возвращаемому значению внутри 'operator []', из которого вы возвращаете это значение. Вы получаете правильную сторону, когда вы перегружаете 'operator =' на тип возвращаемого значения. Чтобы проиллюстрировать это: 'a [5] = HERE' примерно эквивалентен' V & ret = a.operator [] (5); ret.operator = (ЗДЕСЬ); ' – dyp

+0

Ну,' a [4] = HERE' означает (интуитивно, предполагая, что оператор ведет себя последовательно со встроенными типами) "назначьте ЗДЕСЬ' a [4] '" (при условии, что 'a 'is not const, а HERE - макро/переменная, определенная где-то). Что вы думаете об этом? – JBL

ответ

8

Не думайте о operator[] как функцию, чтобы получить или установить, что может вводить в заблуждение. Подумайте об этом как о нормальной функции. На самом деле, давайте перепишем его в качестве нормальной функции:

struct X 
{ 
    int arr[10]; 
    int& getIndex(int idx) { return arr[idx]; } 
}; 

//... 
//initialize x of type X 
x.getIndex(3) = 42; 

Метод x.getIndex(3) возвращает ссылку на 4-й элемент в массиве члена idx. Поскольку вы возвращаетесь по ссылке, возвращаемое значение является значением l и ссылается на этот точный элемент, поэтому вы можете присвоить ему значение, скажем, 42. Это изменит член x.arr[3], поскольку функция возвращает псевдоним для этого конкретного объекта.

Теперь вы можете переписать это в терминах operator[] точно, как и прежде

struct X 
{ 
    int arr[10]; 
    int& operator[](int idx) { return arr[idx]; } 
}; 

и получить тот же результат, вызвав

x[3]; 

или даже

x.operator[](3); 

Оператор вариант - это просто синтаксический сахар.

+1

+1 это просто, но умный. –

+0

ОК, поэтому невозможно сделать логику внутри перегрузки [] на основе значения и ключа? –

+1

@EpiX как вы нарисовали этот вывод? –

Смежные вопросы