2012-01-25 15 views
10

Czy istnieje sposób na wdrożenie operatora->, nie tylko operatora *. Aby mieć następujący kod:Jak zaimplementować operator-> typ iteratora?

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

Powiedzmy, że typ wartości ma metodę get. Kiedy Iterator jest implemnted jak poniżej:

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

... Tutaj jest implementacją uzyskanie właściwej obiektu T.

Jakoś to nie zadziała, kiedy wdrożę go w ten sposób. Chyba coś źle zrozumiałem.

+0

Można również znaleźć przykład tutaj: http://www.boost.org/doc/libs/1_48_0/boost/smart_ptr/shared_ptr.hpp – nijansen

+0

możliwy duplikat [Przeciążenie operatora] (http://stackoverflow.com/questions/4421706/operator-overloading) –

+0

W szczególności przeczytaj "Operatory dla typów podobnych do wskaźnika" ["Common operatory to overload"] (http: // stackoverflow. com/a/4421719/90527) z pytania, do którego Mike prowadzi odnośnik, zwracając szczególną uwagę na podpis operatora '>. – outis

Odpowiedz

15

operator-> powinien powrócić wskaźnik:

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

operator* powinien zwrócić odwołanie jeśli chcesz go używać do modyfikacji:

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

Jak dziwne, jak może się to wydawać, chcesz zwracają wskaźnik do T, wygląda następująco:

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

lub wskaźnik do const.

2

Nie określić, co „nie będzie działać "oznacza - czy nie kompiluje się, czy robi coś innego, niż się spodziewano? Założę się, że to kompiluje, ponieważ z twojego fragmentu nie rozumiem, dlaczego nie powinno.

Co robisz, powraca przez wartość. Zwróć więc nową instancję wskazanego obiektu. Zamiast tego należy zwrócić wskaźnik w operator-> i odniesienia w operator*

+0

Nie zostanie skompilowany, ale nie pamiętam właściwego komunikatu o błędzie. – kokosing