在 C++ 中覆盖 == 运算符

Overriding == operator in C++

我试图覆盖 class 的 == 运算符,但是比较似乎以某种方式失败了。当我编写与名为 eq(例如)的函数相同的函数时,不会出现任何问题。

class geo
{
    ...
        bool operator==(geo const& other)
        {
            if(_id != other._id) return false;
            if(!(name == other.name))return false; 
            if(is_primary!=other.is_primary)return false;
            for(int i = 0; i<6;i++){
                if(position[i]!=other.position[i])
                    return false;
            }
            return true;
        }
   ....
    private:
        int _id, is_primary;
        vector position;
        string name;

}

在主函数中: ...

geo* i= new geo(2.1, 2.82, 1, 0, 0, 180, 0, "Patient-1",1);
geo* j= new geo(2.1, 2.82, 1, 0, 0, 180, 0, "Patient-1",1);
if(i==j)
    std::cout<<"they are equal\n";

然而,当我 运行 这个时,它说它们对于 i 和 j 是不同的。知道我哪里做错了吗?

编辑: 谢谢 guyz 的评论。我刚刚解决了它; 上面显示的代码工作得很好。当然,如果我试图简化代码以使此处粘贴可读的内容。所以我正在更新上面的代码,把它变成一个问题,这样未来的读者可能会看到比我做的更好的解决方案,同时我也可以学到更多。

通过执行 i == j,您比较的是指向 geo 的两个指针,而不是它们所指向的对象。由于指针明显不同,所以得到的结果是这样的。

要真正比较对象,您需要取消引用指针:

if (*i == *j) `

在我看来,您的地理区域 class 的比较运算符是其成员的词法比较。

您可能有兴趣知道可以使用 tuple 通过按适当顺序构建 std::tie 成员来统一所有比较运算符。

示例:

#include <string>
#include <vector>
#include <tuple>
#include <iostream>

class geo
{
public:
    template<class...Args>
    geo(Args&&...);

private:
    auto as_tuple() const { 
        // note: mentioned in lexographical order
        return std::tie(_id, name, is_primary, position); 
    }

    friend auto operator ==(geo const& l, geo const& r) -> bool
    {
        return l.as_tuple() == r.as_tuple();
    }

    friend auto operator <(geo const& l, geo const& r) -> bool
    {
        return l.as_tuple() < r.as_tuple();
    }

private:
    int _id, is_primary;
    std::vector<int> position;
    std::string name;
};


int main()
{
    geo i= geo(2.1, 2.82, 1, 0, 0, 180, 0, "Patient-1",1);
    geo j= geo(2.1, 2.82, 1, 0, 0, 180, 0, "Patient-1",1);

    if(i==j) {
        std::cout<<"they are equal\n";
    }

    if(i < j) {
        std::cout<<"i is less\n";
    }
}