在 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";
}
}
我试图覆盖 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";
}
}