2012-09-13 29 views
6

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?

+4

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

+7

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

+0

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

Trả lời

12

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.

+1

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á. –

+2

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 –

+0

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. –

13

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); 
} 
+0

không giống hệt nhau, nhưng giống nhau :)) tốt nhất. –

+0

@LuchianGrigore từ ngữ đã rẽ sai gần "cả hai [đối tượng]" nếu chúng ta muốn nghiêm ngặt :) – Kos

+0

@Kos: Nếu có ai biết cách diễn tả chính xác bằng tiếng Anh, tôi sẽ sẵn sàng cập nhật câu trả lời của tôi :) – Gorpik

3

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 objectsreference 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.

2

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)

Các vấn đề liên quan