2010-10-29 8 views
12

Sobrecargué el operador < < de una clase. ¿Cómo debo sobrecargar al operador si quiero usarlo en punteros, como el siguiente?Uso de operadores sobrecargados en punteros

class A { 
    std::string operator<<(std::string&); 
} 

aInst << "This works"; 
aPointer << "This doesnt work"; 
aPointer->operator<<("Whereas this works but is useless"); 

Espero que me puedan ayudar.

Heinrich

Respuesta

23

Es necesario eliminar la referencia al puntero del primero.

A *ptr = new A(); 
(*ptr) << "Something"; 

La única otra forma es la forma en que se describió anteriormente

Editar: solución de Andre a continuación es viable también, pero como él dijo que no puede ser una buena idea.

3

No puede hacer eso. Las funciones del operador solo se consideran para operandos que tienen tipos de enumeración o clase entre ellos.

Después de todo, cambia un puntero, pero no una clase. Necesita decir explícitamente que desea cambiar a un objeto de clase desmarcando primero el puntero.

+0

@sbi, gracias. fijo –

+0

(Tenga en cuenta que "tipos de clase" abarca estructuras y uniones.) – sbi

+0

@sbi correcto. las estructuras y los sindicatos son clases. Las funciones del operador se consideran cuando las estructuras y uniones son operandos de un operador adecuado, como para las clases declaradas con la clave de clase "clase". –

0

Normalmente no hay una buena razón para hacerlo, ya que semánticamente el operador < < devuelve la referencia al objeto de secuencia. Y técnicamente, básicamente no puedes hacer eso.

+2

No, semánticamente 'operator <<' debe devolver el argumento del lado izquierdo. –

10

En primer lugar, para seguir con las convenciones estándar, su operator<< debe ser declarada como esto:

class A { 
    A& operator<<(const std::string&); 
}; 

Ahora, técnicamente, se podría cumplidor parte de lo que quiere mediante la aplicación de la siguiente función global:

A * operator<< (A * a, const std::string& s) { (*a) << s; return a; } 

Esto permitiría declaraciones como:

Sin embargo, usted no será capaz de escribir lo siguiente:

aPointer << "this will not compile."; 

En cualquier caso, la escritura tal operador sería confuso, en el mejor de. Usted debe vivir con la sintaxis más sencilla de

(*aPointer) << "this will be printed."; 

y escribir código que se adhiere a las convenciones establecidas para permitir a otros (ya usted mismo, en unas pocas semanas) para leer el código.

Cuestiones relacionadas