重载操作符==

C++ Overload operator ==

本文关键字:操作符 重载      更新时间:2023-10-16

我创建了一个类Location。这个类是CityVillage类的父类。Location类是抽象的。我已经创建了一个vector<Location*> locations,其中包含城市和村庄。Location包含一个名称。如果两个位置有相同的名称,则意味着它们是相同的。我为Location重载了操作符==

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中有一个同名的城市。你能告诉我问题出在哪里吗?谢谢你!

由于vector存储指针,因此std::find将比较指针,而不会调用Location::operator==()来比较元素。

您需要使用std::find_if和lambda:

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

lambda对指针解引用,然后使用==调用Location::operator=

如果位置对象不是很大,我建议你使用std::vector<Location>而不是std::vector<Location*>。如果您使用std::vector<Location>,那么您可以使用std::find,代码将被简化。

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

希望对你有帮助。

您将Location*存储在vectorfind算法将比较pointer的值,而不是Location对象中的名称。您必须为算法提供自定义比较器