0

我正在尝试创建一个可以填充类实例的集合。我认为对集合的要求是可以比较元素,因此在这种情况下,我需要告诉我的班级如何比较它们。我创建了以下类:

class Myclass
    {
    public:
    Myclass(int i):storedval(i) {}
    int getval(){return storedval;}

    friend bool operator> (Myclass &first, Myclass &second)
        {
        return first.getval()>second.getval();
        }
    friend bool operator< (Myclass &first, Myclass &second)
        {
        return first.getval()<second.getval();
        }   

    private:
    int storedval;
    };

但是当我尝试将实例添加到这样的集合时:

Myclass a(50);
set<Myclass> Bunchofclasses;
Bunchofclasses.insert(a);

它给了我一堆错误文本,我认为告诉我它不理解 > 和 < 运算符。这应该如何正确完成?

4

2 回答 2

4

您需要将const引用传递给比较函数,因为它不应该被允许修改被比较的项目:

friend bool operator< (const Myclass& first, const Myclass& second)
{ //                   ^^^^^                 ^^^^^
  return first.getval() < second.getval();
}

这也需要您制作getVal() const。这使得它可以在const实例上或通过const引用调用:

int getval() const {return storedval;}
//           ^^^^^

请注意,您不需要operator>设置工作。小于就足够了。

严格来说,这里不需要friend函数,因为您正在调用public成员函数。唯一friend带来的就是允许您在类定义中声明一个非成员函数。

于 2013-08-13T14:33:16.527 回答
3

集合的元素是不可变的,因此集合需要能够比较const值。所以比较需要是:

friend bool operator< (Myclass const &first, Myclass const &second)
//                             ^^^^^                 ^^^^^

(您可能还应该operator>使用您提供的任何其他非变异操作来执行此操作;但set只需要operator<)。

此外,为了访问const对象的值,访问器还需要是const

int getval() const
//           ^^^^^
于 2013-08-13T14:37:39.827 回答