首页 > 解决方案 > 重载 operator< 不适用于 claas 的指针

问题描述

如何重载运算符“<”以使用指向类的指针?

静态类的 Operator< 可以正常工作,但对于指针,它不会返回正确的答案,而且似乎根本不起作用。

class Point
{
    int x, y;

public:

    bool operator< (const Point* &p) const 
    { 
        if (x == p->x)
            return y < p->y;
        else
            return x < p->x;
    }
    bool operator< (const Point &p) const 
    { 
        if (x == p.x)
            return y < p.y;
        else
            return x < p.x;     
    }

    Point (int a, int b)
    {
        x = a;
        y = b;
    }
};

这里我测试重载功能。在这两种情况下,我的程序都应该返回false.

    Point* a = new Point(1,2);
    Point* b = new Point(0,0);

    Point c = Point(1,2);
    Point d = Point(0,0);

    cout<< boolalpha << (a<b) << '\n';  <- always returns true
    cout<< boolalpha << (c<d) << '\n';  <- returns false

标签: c++classpointersoperator-overloading

解决方案


您不能为仅内置类型(如operator+(int, double)or operator<(int*、 )重载运算符int*)。这根本不可能。实际上,(a<b)未指定 的行为,因为您正在比较两个不相关的指针(有关更多详细信息,请参阅答案)。但是你可以:

  1. 在比较之前取消引用指针。
  2. 创建一个命名函数,comparePointPointers并将其用作常规函数。
  3. 创建智能指针,将它们包裹在您的指针周围,重载运算符以比较它们。

推荐阅读