2012-02-15 13 views
7

Tôi có các con trỏ Base * cho hai trường hợp của một loại đa hình và tôi cần xác định xem các đối tượng được tham chiếu có tương đương hay không.Có cách tiếp cận thành ngữ nào trong C++ để so sánh các loại đa hình cho tương đương đối tượng không?

Cách tiếp cận hiện tại của tôi là lần đầu tiên sử dụng RTTI để kiểm tra tính bình đẳng của loại. Nếu các kiểu này bằng nhau, thì tôi gọi hàm is_equivalent ảo.

Có cách tiếp cận thành ngữ nào hơn không?

+1

được đối tượng tương đương theo gì với bạn? –

+0

Đối với hầu hết các lớp dẫn xuất, tương đương chỉ đơn giản có nghĩa là các biến thành viên đều có cùng giá trị. – RandomBits

+0

Câu hỏi này có thể liên quan: http://stackoverflow.com/questions/1691007/whats-the-right-way-to-overload-operator-for-a-class-hierarchy –

Trả lời

6

Đối với hầu hết các lớp học có nguồn gốc, tương đương với chỉ đơn giản có nghĩa là các biến thành viên tất cả các giá trị cùng

Trong C++ này được gọi là 'bình đẳng' và thường được thực hiện bằng operator==(). Trong C++, bạn có thể ghi đè lên ý nghĩa của các nhà khai thác, người ta có thể viết:

MyType A; 
MyType B; 
if (A == B) { 
    // do stuff 
} 

Và có == gọi một chức năng tùy chỉnh bạn xác định.

Tôi nghĩ rằng bạn muốn phân biệt sự bình đẳng với danh tính có nghĩa là cùng một đối tượng (tức là cùng một địa chỉ).

Bạn có thể thực hiện nó như hàm thành viên hoặc chức năng miễn phí (từ wikipedia):

bool T::operator ==(const T& b) const; 
bool operator ==(const T& a, const T& b); 

Trong trường hợp của bạn, bạn muốn thực hiện operator== cho lớp cơ sở, và sau đó thực hiện những gì bạn đang làm.

More cụ thể nó sẽ trông như thế này:

class MyBase 
{ 
    virtual ~MyBase(); // reminder on virtual destructor for RTTI 
    // ... 
private: 
    virtual bool is_equal(const MyBase& other); 

    friend bool operator ==(const MyBase& a, const MyBase& b); 

    // ...  
}; 

bool operator ==(const MyBase& a, const MyBase& b) 
{ 
    // RTTI check 
    if (typeid(a) != typeid(b)) 
     return false; 
    // Invoke is_equal on derived types 
    return a.is_equal(b); 
} 


class D1 : MyBase 
{ 
    virtual bool is_equal(const Base& other) 
    { 
     const D1& other_derived = dynamic_cast<const D1&>(other); 
     // Now compare *this to other_derived 
    } 
}; 

class D2 : MyBase; 
{ }; 


D1 d1; D2 d2; 
bool equal = d1 == d2; // will call your operator and return false since 
         // RTTI will say the types are different 
+0

Trong hàm 'operator ==', tôi muốn gọi hàm ảo để so sánh hai đối tượng. Chữ ký của hàm so sánh sẽ giống như 'bool ảo is_equal (MyBase const &)'. Điều này dường như làm việc nhưng yêu cầu một downcast rõ ràng trong việc thực hiện 'is_equal' để lấy kiểu đối tượng dẫn xuất. – RandomBits

+0

Có phải là chữ ký. (Xin lỗi, chỉnh sửa) Có nó đòi hỏi một diễn viên. Bạn có thể chỉ định rằng 'is_equal' phải được gọi với một đối tượng trong cùng một loại, làm cho nó riêng tư để chỉ' == 'có thể gọi nó (trong trường hợp đó bạn cần khai báo toán tử của bạn như một người bạn). –

+0

Bạn quên phần "người bạn" trong bản chỉnh sửa của mình và "ảo". Tôi đã thêm nó (nhưng không được thử nghiệm). –

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