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?
Respuesta
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.
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. –
Sin embargo, no confundamos conceptos con optimizaciones –
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. –
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);
}
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.
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)
- 1. Cómo comparar 2 objetos por la igualdad en Objective-C
- 2. Smalltalk - Comparar dos cadenas para la igualdad
- 3. Al comparar por igualdad, ¿está bien usar `==`?
- 4. ¿Se pueden comparar objetos java.lang.Class con == en Java?
- 5. ¿Cómo funciona Ruby's Array? comparar elementos para la igualdad?
- 6. ¿La forma más compacta de comparar tres objetos para la igualdad usando Java?
- 7. comparar dos lista <string> por la igualdad
- 8. comparar la igualdad de char [] en C
- 9. Probar objetos ActiveSupport :: TimeWithZone para igualdad
- 10. ¿Es una buena idea comparar double.MaxValue para la igualdad?
- 11. ¿Cómo comparar la igualdad entre EObject cuando contenían EList desordenado?
- 12. Método común para comparar dos objetos Java
- 13. Uso de XPath para comparar dos objetos XML para igualdad exacta
- 14. comparar arrays para la igualdad, el orden de los elementos
- 15. ¿Manera fácil de comparar ArrayLists para la igualdad usando JUnit?
- 16. Octave/MATLAB: ¿Cómo comparar las estructuras para la igualdad?
- 17. ActiveRecord igualdad de objetos
- 18. comparar objetos jQuery
- 19. Comparar objetos?
- 20. Cómo probar la igualdad de objetos (ActiveRecord)
- 21. ¿Cuál es la forma más rápida de comparar dos matrices para la igualdad?
- 22. XUnit Afirmación para verificar la igualdad de objetos
- 23. Comparar 2 JSON objetos
- 24. ¿Existe un enfoque idiomático en C++ para comparar tipos polimórficos para la equivalencia de objetos?
- 25. Comparar dos objetos con un cheque para nulo
- 26. ¿Qué tan caro es comparar dos conjuntos desordenados para la igualdad?
- 27. Igualdad entre 2 HashMap
- 28. ¿Qué prueba de igualdad utiliza Ruby's Hash al comparar claves?
- 29. congruencia por la igualdad heterogéneo
- 30. Cómo comparar los valores de función de Scala para la igualdad
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
Bueno, ¿quieres comprobar que los objetos son iguales o si son el mismo objeto? Esto no es lo mismo. – juanchopanza
Ah, supongo que redacté mi título incorrectamente, estoy buscando si son el mismo objeto y no objetos diferentes con el mismo valor; – user1527216