2013-06-12 214 views
0

我想弄清楚如何爲指向Item類對象的Item Pointer類實現運算符<重載。它是程序的一部分,它存儲指向STL集中的Items的指針。對於有序的STL集(按字母排序),重載是必需的。我知道下面的ItemPtr超載的代碼是錯誤的。我認爲我可以對指針進行解引用以獲取實際的項目,但我不知道如何實現這一點。我希望我走在正確的軌道上。我很欣賞任何人都可以分享的任何指針(沒有雙關語意思)。重載運算符<用於指向類對象的指針

bool operator<(const Item& i1, const Item& i2) 
{ 
    const char* str1 = i1.getTitle().c_str(); 
    const char* str2 = i2.getTitle().c_str(); 
    return strcmp(str1, str2); 
} 

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2) 
{ 
    const Item& i1 = *ip1; 
    const Item& i2 = *ip2; 
    return i1 < i2; 
} 

謝謝。

+0

爲什麼不簡單'返回ItemPtr1-> getTitle()< ItemPtr2-> getTitle()'? –

+0

這些朋友功能或類功能? – IanPudney

+0

問題是「你如何寫出尊敬操作」? – doctorlove

回答

2

最簡單的方法,假設你保證有在set沒有無效指針和getTitle()const

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2) 
{ 
    return ip1->getTitle() < ip2->getTitle(); 
} 

我不過告誡說,需要做這種事情觸發我的感覺,有一些可能與您的設計有關。特別是,您爲什麼要在set中存儲指向Item的指針,而不僅僅是Item本身?這真的需要嗎?

+0

我會盡力的,謝謝!我同意這個設計很奇怪 - 它是由一個賦值指令決定的,該賦值的結構是將各個集合中的Item指針存儲在一個包含根據關鍵字索引的集合的映射中。我不完全明白它爲什麼這樣設置 - 它與const正確性有關,因爲所有的項目都被設置爲具有常量指針的常量項目。它真的讓我循環執行 - 感謝您的幫助! – user2479147

0

在執行錯誤的事情是不是比較ItemPtr S,但比較Item S:strcmp()會返回一個非零值時str1str2是不同的,並返回非零值意味着true。如果同時有a < bb < a,則無法獲得有序元素。因爲ItemPtr比較是作爲Item比較的函數實現的,所以它會有同樣的問題。

約翰Dibling給出的解決方案是容易的,正確的,如果你確定ItemPtr總是包含一個有效的參考Item

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2) 
{ 
    return ip1->getTitle() < ip2->getTitle(); 
} 

如果您需要反正比較Item S:

bool operator<(const Item& i1, const Item& i2) 
{ 
    return i1.getTitle() < i2.getTitle(); 
} 
bool operator<(const ItemPtr& ip1, const ItemPtr& ip2) 
{ 
    return *i1 < *i2; 
} 

如果你不能假設ItemPtr存儲有效的參考,你將不得不檢查這種情況。 (但可能你可以假設)。