2012-01-25 20 views
10

¿Hay alguna manera de implementar operador->, no solo el operador *? Para que funcione el código siguiente:¿Cómo implementar operador-> para tipo de iterador?

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

Digamos que el tipo de valor tiene el método get. Cuando iterador es implemnted de la siguiente manera:

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

aquí ... es una implementación de conseguir objeto T derecha.

De alguna manera no funcionará cuando lo implemente de esta manera. Creo que no entiendo bien algo.

+0

También se puede encontrar un ejemplo aquí: http://www.boost.org/doc/libs/1_48_0/boost/smart_ptr/shared_ptr.hpp – nijansen

+0

posible duplicado de [Sobrecarga del operador] (http://stackoverflow.com/questions/4421706/operator-overloading) –

+0

En particular, lea "Operadores para tipos similares a punteros" de ["Operadores comunes para sobrecargar"] (http: // stackoverflow. com/a/4421719/90527) de la pregunta a la que se une Mike, prestando especial atención a la firma de 'operator->'. – outis

Respuesta

15

operator-> debería devolver un puntero:

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

operator* debe devolver una referencia si desea utilizarlo para la modificación:

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

Por extraño que pueda parecer, que desea devolver un puntero a T, de esta manera:

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

o un puntero a const.

2

No se especifica lo que "no va a funcionar "significa: ¿no compila o hace algo más de lo esperado? Asumiré que se compila, porque de su fragmento no puedo ver por qué no debería.

Lo que está haciendo es devolver por el valor. Entonces devuelve una nueva instancia del objeto apuntado. En su lugar, debe devolver un puntero en operator-> y referencia en operator*

+0

No se compilará, pero no recuerdo el mensaje de error correcto. – kokosing

Cuestiones relacionadas