2012-02-15 13 views
7

Bir polimorfik türün iki örneğine Base * işaretçilerim var ve başvurulan nesnelerin eşdeğer olup olmadığını belirlemem gerekiyor.Nesne eşdeğerliği için polimorfik türleri karşılaştırmak için C++ 'da idiomatik bir yaklaşım var mıdır?

Geçerli yaklaşımım, tip eşitliğini kontrol etmek için ilk olarak RTTI'yi kullanmaktır. Türler eşitse, ben bir sanal is_equivalent işlevi çağırırım.

Daha aptalca bir yaklaşım var mı?

türetilmiş sınıfları çoğu için
+1

eşdeğer nesneler Size göre sen? –

+0

Türetilen sınıfların çoğunda, eşdeğer, üye değişkenlerinin hepsinin aynı değeri ifade ettiği anlamına gelir. – RandomBits

+0

Bu soru ilgili olabilir: http://stackoverflow.com/questions/1691007/whats-the-right-way-to-overload-operator-for-a-class-hierarchy –

cevap

6

eşdeğer basit bir üye değişkenler C

aynı değerini ++ bu da eşitliğin olarak adlandırılır ve genellikle operator==() kullanılarak gerçekleştirilir olduğu anlamına gelir.

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

Ve == çağrıyı tanımlayacağınız özel fonksiyonu vardır: Eğer operatörler anlamını geçersiz kılabilir C++, yazmak mümkündür. Eşitliği, aynı nesne (yani aynı adres) anlamına gelen kimlikten ayırmak istediğinizi düşünüyorum. Senin durumunda

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

Eğer temel sınıf için operator== uygulamak istiyoruz ve sonra ne yaptığını gerçekleştirin:

Sen üyesi fonksiyonu ya da (wikipedia itibaren) serbest fonksiyonu olarak bunu uygulayabilirsiniz.

Daha somut olarak, bu şekilde görünecektir:

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

'operator ==' işlevinde, iki nesneyi karşılaştırmak için sanal bir işlev aramak istiyorum. Karşılaştırma işlevinin imzası, sanal bool is_equal (MyBase const &) 'gibi bir şey olmalıdır. Bu çalışır gibi görünüyor ama türetilmiş nesne türüne ulaşmak için 'is_equal' uygulamasında açık bir downcast gerektirir. – RandomBits

+0

Evet, imza olmalı. (Üzgünüm, düzenle) Evet, bir yayın gerektiriyor. Aynı türdeki bir nesneyle 'is_equal' çağrılmalı, bunu yalnızca' == 'çağırabilmesi için özel yapmalıdır (Bu durumda operatörünüzü arkadaş olarak bildirmeniz gerekir). –

+0

Düzenlemenizdeki "arkadaş" bölümünü ve bir sanal öğeyi unuttun. Ben ekledim (ama test edilmemiş). –

İlgili konular