创建一组类

Creating a set of classes

本文关键字:一组 创建      更新时间:2023-10-16

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

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);

它给了我一堆错误文本,我想告诉我它不理解>和<操作员。应该如何正确地做到这一点?

您需要将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在这里带来的唯一功能是允许您在类定义内部声明一个非成员函数。

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

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

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

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

int getval() const
//           ^^^^^