2012-06-18 63 views
2

我有一個虛擬class Element迫使其派生類有一個==操作符:如何強制派生類比較

所以,我的派生類(整數,字)實現該操作。

我有一個class Group基本上是一個元素列表。

在一個功能,我想如果從一組它等於給不同的組的元素的元素,所以我用比較:

if(actual == lookingfor) 

其中實際和lookingfor是指向元素...但是比較是在指針級別進行的,所以兩個指針總是不同的。

我該如何強制從元素的派生類中使用運算符==?

編輯:

class Element 
{ 
    virtual int operator==(Elemento *)=0; 
} 

class Word : public Element { ... } 

int Word::operator==(Element * element) 
{ 
    Element * ptr = element; 
    Word * wordPtr = dynamic_cast< Word * >(ptr); 
    int equal = 0; 
    if(wordPtr) 
    { 
    equal = strncmp(this->ptr,wordPtr->ptr,49)==0; 
    } 
    return igual; 
} 

回答

0

請不說,下面的實現使用作爲參數傳遞給operator==定義爲純抽象struct Element引用,而不是指針。這是通常的做法,我建議你在你的代碼中做同樣的事情。

#include <iostream> 

struct Element { 
    virtual ~Element() {} 
    virtual bool operator== (Element&) const =0; 
}; 

struct Integer : Element { 
    bool operator== (Element&) const { 
    return false; /* dummy impl */ 
    } 
}; 

struct Word : Element { 
    bool operator== (Element&) const { 
    return false; /* dummy impl */ 
    } 
}; 

這是不可能超載指針的對比中C++,你將不得不取消引用的指針,這樣你會得到你可以在一個正常的方式比較有效的對象,和你自己將會調用operator==

int 
main (int argc, char *argv[]) 
{ 
    Element * e1 = new Integer; 
    Element * e2 = new Word; 

    if (*e1 == *e2) 
    ; 

    delete e2; 
    delete e1; 
} 

另一種方法是直接通過指針打電話給你operator==,如在下面的例子。

if (e1->operator== (*e2)) 
    ; 

+0

謝謝refp,我必須使用指針,因爲我必須堅持已經寫成的「Element.h」虛擬 int operator ==(Elemento *)= 0; 當我嘗試解除引用時,我得到一個錯誤:在'*實際== *尋找'中找不到'操作符==' – ednincer

+0

它實際上使用: actual-> operator ==(尋找) 謝謝! – ednincer

0

首先,樣本代碼將是很好...

從信息比特導出你的代碼看起來是這樣的

Group* group1 = new Group(); 
Group* group2 = new Group(); 

if (group1 == group2) 

這是指針比較。你必須比較實例:

if (*group1 == *group2) 
0

if(actual == lookingfor)

where both actual and lookingfor are pointers to Element...but the comparison is being made at the level of pointers, so both pointers are always different.

你不能。只有當至少一個參數是用戶定義的類型時,才能重載C++中的運算符。編譯器會在其他任何地方標記錯誤。

如果你想在這種情況下進行比較,你必須使用:

if(*actual == *lookingfor) //for element-comparison 

如果你想比較指針數組,或類似的東西,你必須訴諸編寫使用循環自己的代碼。

我在這裏建議的是,爲什麼不使用std::vector<Element>或任何其他合適的STL容器?

+0

謝謝,但是當我使用(*實際== * lookingfor)我收到以下錯誤: '*實際== * lookingfor' – ednincer

1

我不知道==操作符會相當你想要的這裏,但你總是可以定義一個虛方法:

class Element { 
[...] 
    virtual IsEqualTo(const Element & rhs) const = 0; 
}; 

...然後對每個子類,實現方法像這樣:

class Word : public Element { 
[...] 
    virtual IsEqualTo(const Element & rhs) const 
    { 
     const Word * wrhs = dynamic_cast<const Word *>(&rhs); 
     return ((wrhs)&&(*wrhs == *this)); 
    } 
}; 

...然後你的羣法既可以直接在該組中的各種元素在必要時調用IsEqualTo(),或者如果你喜歡,使其「漂亮」,你可以實現要素:: operator ==(const Element &)來調用IsEqualTo()在內部改爲,並讓你的組方法(等)調用它,例如

bool Element :: operator == (const Element & rhs) const 
{ 
    return IsEqualTo(rhs); 
} 
+0

敵不過 '==操作符' 的東西是我必須堅持已經寫好的「Element.h」 virtual int operator ==(Elemento *)= 0; – ednincer