2012-09-13 43 views
6

Tengo una función que compara objetos por cada atributo para ver si son idénticos. Pero me preguntaba, ¿sería mejor comparar el objeto por su dirección en lugar de comprobar si son exactamente los mismos objetos?¿Se pueden comparar objetos por dirección para la igualdad?

+4

Si los dos objetos tienen la misma dirección, son iguales. Aunque si dos objetos tienen los mismos atributos, no son necesariamente los mismos ... – SinisterMJ

+7

Bueno, ¿quieres comprobar que los objetos son iguales o si son el mismo objeto? Esto no es lo mismo. – juanchopanza

+0

Ah, supongo que redacté mi título incorrectamente, estoy buscando si son el mismo objeto y no objetos diferentes con el mismo valor; – user1527216

Respuesta

12

debe decidir si sus clases están destinadas a apoyar la equivalencia o identidad. La equivalencia es una propiedad típica de valores, como los números. La identidad es una propiedad típica de entidades, como personas.

La equivalencia generalmente se determina comparando los miembros de datos de una clase; comparar direcciones es una forma razonable de verificar la identidad.

+1

Aunque la identidad implica equivalencia, a menudo es más rápida de probar (a menudo mucho) y comparar algo consigo mismo surge con la suficiente frecuencia, que cuando se quiere respaldar la equivalencia, también vale la pena probar la identidad como atajo. –

+2

Sin embargo, no confundamos conceptos con optimizaciones –

+0

Creo que vale la pena en este caso, porque en sí mismo que funciona muestra la relación entre los dos conceptos: Un objeto siempre debe ser equivalente a sí mismo, si no lo es, usted está haciendo está mal. –

13

EDITAR: Cuidado: no puede pasar valores (objetos) a su función si quiere que funcione correctamente. Necesita pasar referencias (puntas) o probablemente (const).

Si lo que desea es saber si ambas referencias o punteros apuntan al mismo objeto (objetos no idénticas, pero la misma), la comparación de las direcciones es lo que hay que hacer, de hecho:

bool AreEqual(const Class& a, const Class& b) 
{ 
    return &a == &b; 
} 

Tenga en cuenta que el operador & puede estar sobrecargado para la clase anterior Class. Puesto que C++ 11 la plantilla de función std::addressof está disponible para hacer frente a este hecho:

#include <memory> //std::addressof 
bool AreEqual(const Class& a, const Class& b) 
{ 
    return std::addressof(a) == std::addressof(b); 
} 
+0

no idéntico, pero el mismo :)) bueno. –

+0

@LuchianGrigore la redacción tomó un giro equivocado cerca de "ambos [objetos]" si queremos ser estrictos :) – Kos

+0

@Kos: Si alguien sabe cómo expresarlo correctamente en inglés, con gusto actualizaré mi respuesta :) – Gorpik

3

supongo que haga una distinción adecuada entre el mismo y la igualdad.

Dos punteros que apuntan a la misma dirección significa que apuntan al mismo objeto. Entonces sí: la misma dirección significa el mismo objeto y por lo tanto igual (aunque la igualdad tiene sentido solo si hablamos de más de 1 objeto).

Los mismos atributos no significan necesariamente el mismo objeto. P.ej. puede tener dos usuarios con el mismo nombre "John Doe". Los objetos que los representan seguirán siendo objetos diferentes, por lo que no se pueden usar indistintamente. Sin embargo, si tiene una clase Point, entonces dos instancias diferentes de {1, 2} realmente representan lo mismo y se pueden usar indistintamente.

Existe un problema mayor de diferencia entre value objects y reference objects or entities, por lo que le sugiero buscarlo.

E.g. si tiene una clase Point, entonces dos instancias diferentes de {1, 2} realmente representan lo mismo, a diferencia del ejemplo de Usuario anterior.

2

Si tiene objetos para los cuales la comparación lleva mucho tiempo, comparar los punteros podría usarse como una forma rápida de determinar la equivalencia del objeto (es decir, si los punteros son iguales, los objetos son equivalentes, de lo contrario pueden ser equivalentes)

Cuestiones relacionadas