2010-05-25 20 views
5

vi este código, pero yo no podía entender lo que hace:sobrecarga de operador -> en C++

inline S* O::operator->() const 
{ 
    return ses; //ses is a private member of Type S* 
} 

así que lo que sucede ahora si he usado ->?

+0

Por cierto, esto es C++ solo porque el lenguaje C no permite la función ni la sobrecarga del operador. Este es otro problema que diferencia los dos idiomas. –

Respuesta

2

es que hay una instancia de la clase O y lo hace

obj->func() 

entonces el del operador> devuelve ses y luego se usa el puntero devuelto a llamar func().

ejemplo completo:

struct S 
{ 
    void func() {} 
}; 

class O 
{ 
public: 
    inline S* operator->() const; 
private: 
    S* ses; 
}; 

inline S* O::operator->() const 
{ 
    return ses; 
} 

int main() 
{ 
    O object; 
    object->func(); 
    return 0; 
} 
+1

qué sucede si el func() de S fue declarado como tal: virtual void func() = 0; – hero

+0

las funciones virtuales deberían al menos estar protegidas, pero preferiblemente privadas. Es responsabilidad de la clase S asegurarse de que ses esté apuntando a un objeto válido. –

+0

funciones privadas virtuales? A menos que esté lleno de declaraciones de clase de amigo, creo que lo privado y lo virtual son mutuamente exclusivos. – luiscubal

0

Es un operador sobrecargado que devolvería un puntero a algún miembro del tipo S.

Al igual que, si se escribe

O object; 
(object->)... 

la parte (object->) se convertiría en el puntero.

-1

se sobrecarga el operador -> O de la clase, que devuelve ahora una S * en lugar de un O *

+3

Por defecto, la clase O no tiene un operador -> que devuelve un O *. –

0

Cada vez que un objeto de tipo O utiliza el operador -> se devuelve un puntero a ses.

11

Ahora bien, si usted tiene

O object; 
object->whatever() 

por primera vez el operator-> sobrecargado serán llamados, que devolverá ses almacenados en el propio objeto, entonces operator-> (built-in en caso de S*) se volverá a llamar para el puntero devuelto.

Así

object->whatever(); 

es equivalente a pseudocódigo:

object.ses->whatever(); 

esto último sería, por supuesto, imposible ya que es O::sesprivate - es por eso que lo llamo pseudocódigo.

Con dicha sobrecarga puede crear un contenedor alrededor de un puntero; dicho contenedor generalmente se llama puntero inteligente.

+0

"Con suce overload" => ¿Quiso decir "such" o es "suce" el nombre del operador '->'? (hablante de inglés no nativo) – ereOn

+0

@ereOn: corregidos, eso eran errores tipográficos. – sharptooth