2010-10-06 15 views
6

Tengo una clase llamada AString. Es bastante básico:Cómo sobrecargar operador ==() para un puntero a la clase?

class AString 
{ 
public: 
    AString(const char *pSetString = NULL); 
    ~AString(); 
    bool operator==(const AString &pSetString); 
    ... 

protected: 
    char *pData; 
    int iDataSize; 
} 

Ahora quiero escribir código como este:

AString *myString = new AString("foo"); 
if (myString == "bar") { 
    /* and so on... */ 
} 

Sin embargo, el operador de comparación existente sólo admite

if (*myString == "bar") 

Si omito que asterisco, la el compilador no está contento

¿Hay alguna manera de permitir que el operador de comparación compare *AString con const char*?

+4

¿Por qué asigna dinámicamente 'myString'? ¿Por qué no es 'operator ==' un miembro 'const'? O mejor, ¿por qué es un miembro? O mejor aún, ¿por qué estás escribiendo tu propia clase de cuerda? – sbi

+1

(1) No debería. Eso fue un error (2) ¿Podrías dar más detalles sobre eso? (3) ¿Por qué no sería miembro? (4) Porque la plataforma de destino es un sistema integrado que no tiene una clase de cadena nativa. – bastibe

+0

2. Si no lo haces const, entonces no funcionará para const AString: s, 3. Como no necesita ser miembro y daría como resultado una mejor encapsulación, 4, ¿qué quieres decir con "cadena nativa"? clase"? tienes std :: string. – ronag

Respuesta

8

No, no lo hay.

sobrecargar operator==, debe proporcionar un tipo definido por el usuario como uno de los operandos y un puntero (ya sea AString* o const char*) no califica.
Y cuando se comparan dos punteros, el compilador tiene una función incorporada muy adecuada operator==, por lo que no considerará la conversión de uno de los argumentos a un tipo de clase.

2

[Respuesta original estaba mal y por lo tanto corrige a continuación]

Como ha señalado Oli Charlesworth, en un comentario más abajo, esto es imposible.

Usted tendría que definir un operador como

bool operator==(const AString *as, const char *cs); // Note: C++ will not do that 

pero no se puede sobrecargar un operador a menos que uno de sus parámetros es de tipo no primitivo - y punteros (ambos punteros a AString y punteros a char) son primitivos tipos.

+1

Pero hacer esto podría llevar a más sorpresas cuando se comparen los punteros ¡después! – Benoit

+2

No puede sobrecargar a los operadores a menos que uno de ellos sea de tipo no primitivo. –

+0

... que debería decir "operadores no miembros". –

10

No, a menos que lo envuelva en algún tipo de clase de puntero inteligente, pero eso haría que la semántica sea extraña. ¿Qué pasa con if (*myString == "bar")?

3

Creo que lo que quiere es incorrecto ya que oscurece el sistema de tipos de C++. myStringes a puntero a AString y no a AString. No intentes ocultar el hecho de que es un puntero. Es un punto de entrada para errores feos y si estás codificando en un equipo, ¡todos los demás estarían confundidos!

3
if (myString == "bar") 

incluso si usted consigue que funcione, es muy confuso para los demás. Está comparando un puntero a un objeto con un literal de cadena. Una manera mucho más clara para conseguir este trabajo es eliminar la referencia al puntero, y proporcionar una sobrecarga como

bool operator==(const char* pSetString); 
Cuestiones relacionadas