Tôi có một hàm so sánh các đối tượng theo từng thuộc tính để xem chúng có giống nhau hay không. Nhưng tôi đã tự hỏi, sẽ tốt hơn nếu so sánh đối tượng theo địa chỉ của họ thay vì kiểm tra xem chúng có phải là những vật thể giống hệt nhau không?Bạn có thể so sánh các đối tượng theo địa chỉ bình đẳng không?
Trả lời
Bạn nên quyết định xem các lớp học của bạn có nghĩa là hỗ trợ tương đương hoặc danh tính. Tương đương là thuộc tính điển hình của các giá trị , chẳng hạn như số. Danh tính là một thuộc tính điển hình của đối tượng, chẳng hạn như mọi người.
Tương đương thường được xác định bằng cách so sánh các thành viên dữ liệu của một lớp; so sánh địa chỉ là một cách hợp lý để kiểm tra danh tính.
Mặc dù danh tính đòi hỏi sự tương đương, thường là nhanh hơn để kiểm tra (thường rất nhiều) và so sánh một cái gì đó với chính nó đi lên thường xuyên đủ, khi bạn muốn hỗ trợ tương đương nó có thể là giá trị thử nghiệm cho bản sắc như là một cắt ngắn, quá. –
Tuy nhiên chúng ta không nên nhầm lẫn các khái niệm với tối ưu hóa –
Tôi nghĩ nó đáng giá trong trường hợp này, bởi vì nó hoạt động cho thấy mối quan hệ giữa hai khái niệm: Một đối tượng phải luôn luôn tương đương với chính nó, nếu không, bạn đang làm nó sai. –
EDIT: Cẩn thận: bạn không thể chuyển giá trị (đối tượng) cho hàm của bạn nếu bạn muốn nó hoạt động chính xác. Bạn cần phải chuyển hoặc tham chiếu (có thể là const) hoặc con trỏ.
Nếu bạn chỉ muốn biết liệu cả hai tài liệu tham khảo hoặc con trỏ trỏ đến cùng một đối tượng (đối tượng không giống nhau, nhưng giống nhau), so sánh các địa chỉ là điều phải làm, quả thật vậy:
bool AreEqual(const Class& a, const Class& b)
{
return &a == &b;
}
Lưu ý rằng toán tử &
có thể bị quá tải đối với lớp học Class
ở trên. Kể từ C++ 11 chức năng template std::addressof
có sẵn để đối phó với thực tế là:
#include <memory> //std::addressof
bool AreEqual(const Class& a, const Class& b)
{
return std::addressof(a) == std::addressof(b);
}
Tôi giả sử rằng bạn thực hiện một sự phân biệt đúng đắn giữa giống nhau và bình đẳng.
Hai con trỏ trỏ đến cùng một địa chỉ có nghĩa là chúng trỏ đến cùng một đối tượng. Vì vậy, có: cùng một địa chỉ có nghĩa là cùng một đối tượng và do đó bằng nhau (mặc dù bình đẳng có ý nghĩa chỉ khi chúng ta nói về nhiều hơn 1 đối tượng).
Các thuộc tính giống nhau không nhất thiết có nghĩa là cùng một đối tượng. Ví dụ. bạn có thể có hai người dùng có cùng tên "John Doe". Các đối tượng đại diện cho chúng sẽ vẫn là các đối tượng khác nhau, vì vậy chúng không thể được sử dụng thay thế cho nhau. Tuy nhiên, nếu bạn có một lớp Point, sau đó hai trường hợp khác nhau của {1, 2}
thực sự đại diện cho cùng một điều và có thể được sử dụng thay thế cho nhau.
Có vấn đề lớn hơn về sự khác biệt giữa value objects và reference objects or entities, vì vậy tôi đề nghị tìm kiếm.
Ví dụ: nếu bạn có một lớp Point, thì hai trường hợp khác nhau của {1, 2}
thực sự đại diện cho cùng một điều, không giống như ví dụ User trước đây.
Nếu bạn có đối tượng so sánh mất thời gian, việc so sánh con trỏ có thể được sử dụng như một cách nhanh chóng để xác định tương đương đối tượng (ví dụ: nếu con trỏ bằng nhau, đối tượng tương đương, nếu không chúng có thể tương đương)
- 1. ActiveRecord bình đẳng đối tượng
- 2. Java So sánh các địa chỉ
- 3. phao so sánh (bình đẳng) trong CoreGraphics
- 4. chuỗi So sánh bình đẳng trong ksh
- 5. Làm thế nào để so sánh 2 đối tượng cho sự bình đẳng trong Objective-C
- 6. Đối sánh mẫu Bất bình đẳng
- 7. Tôi có thể tìm một bộ quy tắc đối chiếu cụ thể để so sánh bình đẳng các chuỗi?
- 8. Có phải tất cả so sánh PHP bình đẳng đối xứng không?
- 9. So sánh bình đẳng tùy chỉnh cho WPF ComboBox
- 10. Kiểm tra đối tượng bình đẳng trong Jasmine
- 11. Integer chuỗi so sánh đều bình đẳng (PHP lỗi?)
- 12. Bạn so sánh địa chỉ IP như thế nào?
- 13. đối tượng So sánh trong ruby
- 14. So sánh đối tượng ngày JavaScript
- 15. Làm cách nào tôi có thể so sánh Danh sách để bình đẳng trong Dart?
- 16. Mảng của Ruby. so sánh các yếu tố cho sự bình đẳng?
- 17. Kiểm tra bình đẳng nào mà Hash của Ruby sử dụng khi so sánh các khóa?
- 18. LINQ Trừ điều hành và đối tượng bình đẳng
- 19. Làm thế nào để so sánh các mảng đa chiều trên bình đẳng?
- 20. Làm thế nào để so sánh các giá trị hàm Scala cho sự bình đẳng
- 21. So sánh hai đối tượng
- 22. Làm thế nào để so sánh sự bình đẳng giữa EObject khi chúng chứa EList không có thứ tự?
- 23. Giá đắt như thế nào so sánh hai bộ không theo thứ tự cho sự bình đẳng?
- 24. Liệu một đối tượng Python không ghi đè các toán tử so sánh bằng chính nó?
- 25. Đúc mảng đối tượng thành mảng có thể so sánh
- 26. Thuật toán Khóa đối sánh địa chỉ
- 27. Sự bình đẳng giữa 2 HashMap
- 28. so sánh hiệu quả QString và std :: chuỗi cho sự bình đẳng
- 29. Có phải "==" trong Ruby luôn luôn có giá trị bình đẳng không?
- 30. Các khóa từ điển Python (so sánh các đối tượng lớp) với nhiều so sánh
Nếu hai đối tượng có cùng một địa chỉ, chúng giống nhau. Mặc dù nếu hai đối tượng có cùng thuộc tính, chúng không nhất thiết phải giống nhau ... – SinisterMJ
Vâng, bạn có muốn kiểm tra xem các đối tượng có bằng nhau không, hoặc chúng là cùng một đối tượng? Điều này là không giống nhau. – juanchopanza
Ah Tôi đoán tôi đã viết sai tên, tôi đang tìm kiếm nếu chúng là cùng một đối tượng và không phải là các đối tượng khác nhau có giá trị như nhau; – user1527216