C ++ оператор [] синтаксис - PullRequest
       17

C ++ оператор [] синтаксис

1 голос
/ 02 ноября 2009

Просто быстрый вопрос о синтаксисе. Я пишу класс карты (для школы).

Если я определю следующую перегрузку оператора:

template<typename Key, typename Val> class Map {...
Val* operator[](Key k);

Что происходит, когда пользователь пишет:

Map<int,int> myMap;
map[10] = 3;

Если сделать что-то подобное, будет перезаписана только временная копия указателя [null] на ключе k. Можно ли вообще сделать:

map[10] = 3;
printf("%i\n", map[10]); 

с той же перегрузкой оператора?

1 Ответ

5 голосов
/ 02 ноября 2009

Способ работы с std::map заключается в том, что, если ключ не существует, класс карты вставит значение по умолчанию, а затем вернет lvalue (назначаемую ссылку на значение, связанное с ключом), поэтому может быть назначено новое значение.

Итак, в следующем примере кода, предполагая, что map пусто, это вставит 10 в карту и свяжет его со значением 3.

map[10] = 3;

С вашим пользовательским классом карты operator[] должен сначала проверить, существует ли Ключ k, и, если нет, вставить новую пару ключ / значение (используя конструктор по умолчанию typename Val) в карту. Затем вы можете вернуть ссылку на значение, связанное с новым ключом, чтобы пользователь мог присвоить ему значение. Обратите внимание, что это означает, что Val должен быть Assignable и иметь конструктор по умолчанию.

Это позволяет operator[] использоваться как для вставки, так и для поиска. Вам также следует перегрузить const версию operator[], которая, конечно, поддерживает только поиск.

Редактировать: теперь я заметил в вашем коде, что вы возвращаете указатель. Если вы хотите использовать парадигму вставки / поиска для operator[], используемую std :: map, имеет смысл возвращать ссылку. Возврат указателя дает вам преимущество, заключающееся в том, что вы можете проверить возвращаемое значение operator[] для NULL, чтобы проверить, не существует ли ключ, но, опять же, если вы хотите, чтобы operator[] предоставлял функции поиска и вставки, ссылка иди сюда.

...