2012-01-25 2 views
10

Есть ли способ реализовать operator->, а не только оператор *. Чтобы иметь следующий код:Как реализовать оператор-> для типа итератора?

Iterator<value> it = ... 
i = (*it).get(); 
i = it->get(); // also works 

Позвольте нам сказать, что тип значения имеет метод get. Когда итератор implemnted, как показано ниже:

template<T> class Iterator { 
    T operator*() { return ... } 
    T operator->() { return ... } 
} 

Вот ... это реализация получения правильного объекта T.

Как-то это не сработает, когда я реализую его таким образом. Кажется, я что-то неправильно понимаю.

+0

Вы также можете найти пример здесь: http://www.boost.org/doc/libs/1_48_0/boost/smart_ptr/shared_ptr.hpp – nijansen

+0

возможный дубликат [Перегрузка оператора] (http://stackoverflow.com/questions/4421706/operator-overloading) –

+0

В частности, прочитайте «Операторы для указательных типов» [«Общие операторы для перегрузки»] (http: // stackoverflow. com/a/4421719/90527) от вопроса Майка, обращая внимание на подпись 'operator->'. – outis

ответ

15

operator-> должен возвращать указатель:

T * operator->(); 
T const * operator->() const; 

operator* должен возвращать ссылку, если вы хотите использовать его для модификации:

T & operator*(); 
T operator*() const; // OR T const & operator*() const; 
3

Как бы странно это может показаться, вы хотите вернуть указатель на T, таким образом:

T * operator->() { return &the_value; } 

Или указатель на константные.

2

Вы не уточняете, что «это не будет работать "означает - не удается ли скомпилировать или сделать что-то еще, чем ожидалось? Я предполагаю, что он компилируется, потому что из вашего фрагмента я не понимаю, почему это не должно.

Что вы делаете, возвращается по значению. Таким образом, вы возвращаете новый экземпляр объекта с указателем. Вы должны вместо этого возвращать указатель в operator-> и ссылки в operator*

+0

Он не будет компилироваться, но я не помню правильное сообщение об ошибке. – kokosing

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