【问题标题】:Overloading the comparison operator for object members重载对象成员的比较运算符
【发布时间】:2017-08-09 17:49:51
【问题描述】:

假设我有一个名为 book 的课程:

class Book {
    int i;

    public:
        Book(int ii)
        : i(ii) {
        }

        int ISBN() {
            return i;
        }
};

我想为 Book 类重载比较运算符,这样我就可以创建一个 bool 函数,在遇到 book1==book2 时比较成员“i”。

bool is_same() {
    return (book1==book2) ? true : false;
}

我该怎么做呢?这是我当前拥有的运算符重载函数,它给了我一个“从'bool'类型的右值对'Book&'类型的非常量引用的无效初始化”错误。我目前将类 Book 中的重载函数作为公共函数。

Book& operator==(const Book& b) const {
        return ISBN() == b.ISBN();
    }

我对运算符重载比较陌生,我已经筛选了很多答案,但没有一个能解决我的问题。我了解如何简单地执行 book1==book2,但只有当每个成员都具有相同的值时才会返回 true。在这种情况下,我不止一个,但我只想在两个对象的“i”相同时返回 true。

【问题讨论】:

标签: c++ operator-overloading


【解决方案1】:

你基本上有两个选择:

  1. 使用带有一个参数的成员运算符:

    class Book {
    ...
        bool operator==( const Book &an ) const { return ISDN() == an.ISDN(); }
    };
    
  2. 使用带有 2 个参数的非成员运算符(也可能是 friend 语句):

    bool operator==( const Book &b1, const Book &b2 )
    {
        return b1.ISBN() == b2.ISBN();
    }
    

请注意,ISDN() 应设为 const

无论哪种方式,你都需要返回一个bool,而不是Book &,它通常由赋值运算符=返回,而不是比较运算符==

【讨论】:

  • 这正是我想要的
  • 我不想仅仅为一个小问题创建一个全新的问题,但是如果我有一个名为 book1 的对象,我是否可以使用当前调用该函数的对象作为一个参数?因此,如果我有一个名为 compare() 的函数,并且我调用了 book1.compare(book2),它会自动将 book1 与 book2 进行比较,而不是让我传入两个对象。
  • 这是方法的作用(案例1),您可以将其称为book1 == book2或更明确的book1.operator==( book2 )
  • 所以可以将它放入我用 book1.compare(book2) 调用的 compare() 函数中吗?
  • @sS5H 我不太明白你的问题,你最好用代码示例创建另一个问题来解释你想要实现的目标。您绝对可以将compare() 编写为内部调用== 的方法。例如bool compare( const &b ) const { return *this == b; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多