2014-05-08 175 views
1

我創建了一個類Location。該班級是CityVillage班的父班。 Location類是抽象的。我創建了一個vector<Location*> locations,其中包含城市和村莊。 Location包含一個名稱。如果兩個地點具有相同的名稱,則意味着它們是相同的。我爲Location重載了運營商==C++重載操作符==

bool operator==(const Location& lhs) const 
{ 
    return (this->mName.compare(lhs.mName) == 0); 
} 

如果我想添加一些位置到vector,我首先檢查這個位置是否不存在。我用這個功能:

bool checkLocation(Location* l) { 
    return find(locations.begin(), locations.end(), l) != locations.end(); 
} 

例如,如果我想一些城市加入到vector,上述方法仍返回false,這意味着,Location不存在。但在vector有一個同名的城市。你能告訴我,問題在哪裏?謝謝。

+6

請注意,矢量存儲*指針*,所以'find'調用將比較*指針*而不使用您的'operator =='函數。 –

+1

你應該以某種方式調試你的'operator ==',看它是否被調用。 – StoryTeller

+0

@juanchopanza:'std :: find_if'不需要* binary *謂詞(它不需要,因爲它沒有意義!)。 – Nawaz

回答

7

既然你的向量存儲指針,std::find將比較指針,這將不會調用Location::operator==()來比較元素。

您需要使用std::find_if與拉姆達一起:

return std::find_if(locations.begin(), 
        locations.end(), 
        [l](Location const *x) { 
         return *l == *x;  //invoke operator= 
        }) != locations.end(); 

拉姆達取消引用指針,然後使用==調用Location::operator=

如果位置對象不是很大,我建議您使用std::vector<Location>而不是std::vector<Location*>。如果您使用std::vector<Location>,則可以使用std::find,代碼將被簡化。

即使位置對象很大,最好使用智能指針而不是原始指針。

希望有所幫助。

+0

謝謝。我得到一個編譯錯誤:沒有匹配函數調用find_if(我已包含)。 – PetrS

+0

@PSglass:引用* actual *錯誤。 – Nawaz

+0

錯誤:沒有匹配函數調用'find_if(std :: vector :: iterator,std :: vector :: iterator,checkLocation(Location *):: __ lambda0) – PetrS

1

您在vector中存儲Location*find算法將比較pointer的值,而不是Location對象中的名稱。您必須爲算法提供自定義比較器。