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 ->
?
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 ->
?
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;
}
qué sucede si el func() de S fue declarado como tal: virtual void func() = 0; – hero
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. –
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
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.
se sobrecarga el operador -> O de la clase, que devuelve ahora una S * en lugar de un O *
Por defecto, la clase O no tiene un operador -> que devuelve un O *. –
Cada vez que un objeto de tipo O utiliza el operador -> se devuelve un puntero a ses.
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::ses
private
- 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.
"Con suce overload" => ¿Quiso decir "such" o es "suce" el nombre del operador '->'? (hablante de inglés no nativo) – ereOn
@ereOn: corregidos, eso eran errores tipográficos. – sharptooth
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. –