2012-06-11 22 views
7

¿Hay algo como Java equals()? Para comparar si el objeto es del mismo tipo?¿Hay un equivalente del método de Java igual en C++?

public boolean equals(Object obj) { 
    if (obj == null || !(obj instanceof ViewMode)) { 
     return false; 
    } 

    ViewMode dm = (ViewMode) obj; 
    return dm.width == w 
     && dm.h == h 
     && dm.b == b 
     && dm.f == f; 
} 

public int hashCode() { 
    return w^h^f^b ; 
} 
+3

Eliminé la etiqueta 'java' porque un experto en Java no puede ayudar a responder esta pregunta. –

+2

Ha pasado mucho tiempo desde que escribí C++ pero creo que tendrás que sobrecargar el operador ==. – ChadNC

+0

Las pestañas estaban estropeando su formateo. Así que lo arreglé por ti. – Mysticial

Respuesta

12

No. C++ no tiene un modelo de tipo global como Java. No existe el tipo Object del que todos los otros tipos heredan, por lo que no hay métodos (como equals) definidos para todas las clases.

C++ proporciona un marco para construir un modelo de tipo con una operación de comparación universal: operator ==. Depende de usted construir todas las implementaciones de esto en todas sus clases para que puedan interactuar correctamente. Pero no hay implementación predeterminada comparable a Object.equals.

+2

Como nota adicional, idiomática C++ * normalmente * no requiere downcasting de una clase base tanto como Java. –

+1

"no hay métodos (como iguales) que se definan para todas las clases" - se podría hacer un caso para que unario 'operador &' ("dirección-de") se defina para todo, pero eso es solo pedantería ;-) –

5

Puede definir el operator== en su clase.

0

Es posible que pueda utilizar el operador typeid para esto.

13

Por el equivalente idiomático de tu ejemplo, definiría operator== de la siguiente manera:

friend bool operator==(const ViewMode &lhs, const ViewMode &rhs) { 
    return (lhs.w == rhs.w) && the rest; 
} 

friend bool operator!=(const ViewMode &lhs, const ViewMode &rhs) { 
    return !(lhs == rhs); 
} 

En C++ no suelo escribir una función para permitir ViewMode objetos que han de compararse con algo que no tiene nada en absoluto para hacer con ViewMode. Supongo que si realmente quería que la comparación para volver falsa, en lugar de negarse a compilar, entonces se podría añadir un par de operadores de plantillas (como funciones libres, fuera de la clase):

template <typename T> 
bool operator==(const ViewMode &, const T&) { 
    return false; 
} 

template <typename T> 
bool operator==(const T &, const ViewMode&) { 
    return false; 
} 

pero realmente don' lo recomiendo Esa expresión idiomática de Java no se aplica a C++, porque en C++ casi nunca debería tener un objeto, pero no tiene idea de su tipo.

Si desea que su función equals sea virtual, entonces probablemente sea mejor escribir una función virtual equals(), en lugar de usar operator== para ello. Lo escribiría para tomar un parámetro const ViewObject & como parámetro, por lo que no es necesario ningún equivalente al cheque instanceof. Lo cual es bueno, porque C++ no tiene forma de tomar un objeto de tipo totalmente desconocido y probar si se trata de una instancia de un tipo especificado.

Raramente necesita una función de igual polimorfo en C++, pero si la estuviera usando, por ejemplo, en std::unordered_map, especificaría los parámetros de la plantilla adicional al unordered_map. Dale una función de comparación de igualdad que toma dos punteros y llama al equals en una u otra, y una función de almohadilla que hace algo sensato.

+0

Buena llamada Lo había olvidado. –

Cuestiones relacionadas