【问题标题】:Comparison between two objects under the same class同一类下的两个对象之间的比较
【发布时间】:2015-07-26 19:12:24
【问题描述】:

我还是 C++ 的新手(一般编程),如果这个问题很愚蠢或被问过很多次,请原谅我。 这是问题..假设在同一个类下有两个对象 A 和 B。

例如

  class Fruit{
  int apple;
  int banana;
      fruit(int x, int y){
       apple=x;
       banana=y;
      }
  }
  Fruit A(1,1);
  Fruit B(1,1);

如果我想检查对象 A 的内容是否与对象 B 的内容相同,是否必须比较从 A 到 B 的每个变量,或者

   if(Object A == Object B)
   return true;

会做这项工作吗?

【问题讨论】:

  • if(Object A == Object B) return true; 在编译几率为零的情况下怎么能完成这项工作?您需要实现 operator== 并比较您想要的任何数据成员是否相等。
  • 不完全是一个骗子,但是是的,IMO 它应该被标记为一个,因为在链接的到期问题中已经有一个非常好的解释数据库......
  • @thelink2012 坦率地说,我想不出为什么编译器决定实现一个默认的复制 ctor(即使对于带有指针的类)但顽固地生成一个默认的 operator== 的任何充分理由。可以吗?
  • @vsoftco Michael Burr 对链接问题的answer 很好地解释了原因,奇怪的是,OP 选择的答案几乎没有给出很好的理由。此外,还有一个提案正在讨论允许= default 用于比较运算符。

标签: c++ comparison


【解决方案1】:
if(Object A == Object B)
    return true;

会做这项工作吗?不,它不会,它甚至不会编译

错误:'operator==' 不匹配(操作数类型为 'Fruit' 和 'Fruit')

你需要实现一个比较operator==,like

bool Fruit::operator==(const Fruit& rhs) const
{
    return (apple == rhs.apple) && (banana == rhs.banana);
    // or, in C++11 (must #include <tuple>) 
    // return std::tie(apple, banana) == std::tie(rhs.apple, rhs.banana); 
}

【讨论】:

  • 对不起,我不太明白这个运算符是如何工作的……你能解释一下吗?
  • @Galaxyvintage 当您编写fruit1==fruit2 时,编译器会将其转换为fruit1.operator==(fruit2)。所以operator== 像任何其他函数一样在左侧实例上被调用。其余的我认为很清楚,您只是在逐个字段进行比较。
  • 啊我明白了...感谢您的帮助!
  • 我添加了运算符本身应该是 const 的 nit。
  • 一个 C++14 技巧来避免所有 std::tie 样板 - 定义另一个成员函数 auto members() const { return std::tie(...); } 然后上述运算符的主体变为 return members() == rhs.members();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
相关资源
最近更新 更多