【问题标题】:overloading >= operator to compare pointers重载 >= 运算符来比较指针
【发布时间】:2018-11-21 05:25:45
【问题描述】:

我正在尝试将 >= 运算符重载到 Point 类,以便我可以比较指向 Point 实例的两个指针。但它看起来根本没有调用重载运算符,因为它没有打印调试输出。 为什么不调用重载运算符?如何让它发挥作用?

我正在尝试的代码在文件operator.cc

#include <ios>
#include <iostream>

class Point {
    int x, y;
public:
    Point(int x, int y);
    int getX();
    int getY();
    bool operator>=(Point* p);
};

Point::Point(int x, int y) {
    this->x = x; this->y = y;
}

int Point::getX() {
    return this->x;
}
int Point::getY() {
    return this->y;
}

bool Point::operator>=(Point* p) {
    std::cout << "overloaded>=" << std::endl; // does not print anything
    return this->x >= p->getX() && this->y >= p->getY();
}

int main() {
    Point* p1 = new Point(5, 5);
    Point* p2 = new Point(4, 4);
    bool result = p1 >= p2;
    std::cout << std::boolalpha << result << std::endl;
    return 0;
}

但是当我使用g++ operator.cc -o op &amp;&amp; ./op 编译和运行这段代码时,我总是得到输出false,它不会打印overloaded&gt;= 调试消息。

【问题讨论】:

  • 你的重载在PointPoint*之间,不是两个指针,后者不能重载。为什么不(*p1) &gt;= (*p2)?另外,你为什么在这种情况下使用new
  • 您在比较指针时会变得错误。将比较改为 *p1 >= *p2,将函数改为 bool Point::operator>=(const Point& p) 和函数体。
  • 你的操作符会被(*p1) &gt;= p2调用
  • 建议 -- 重载 &lt;== 而不是 &gt;=。所有其他运算符都可以从这两个运算符中创建,而且您的类会立即变得更加健壮。
  • @SidS:如果您使用std::find(例如)使用==(因为它可以用于定义相等但不排序的项目)。您可以从&lt; 合成==,但它不会自行发生。

标签: c++ pointers operator-overloading


【解决方案1】:

要从指向对象的指针调用类的成员函数,使用以下方法。 假设 Point 类中有另一个名为 cmp 的函数,它以指针作为参数。

bool Point::cmp(Point *p)
{
return true;
}

可以通过(*p1).cmp(p2)的指针p1调用。

同样,重载运算符 >= 也可以通过以下方式调用:

bool result = *p1 >= p2;

【讨论】:

    【解决方案2】:

    您几乎总是希望比较实际的 Point 对象,而不是指向 Point 的指针。

    bool Point::operator>=(Point const & p) {
        std::cout << "overloaded>=\n"; // should now print something
        return x >= p.x && y >= p.y;
    }
    

    然后你会像这样调用它:

    int main() {
        Point p1{5, 5};
        Point p2{4, 4};
        std::cout << std::boolalpha << (p1>=p2) << '\n';
    }
    

    附带说明,如果您支持 C++ 中的比较,则重载 operator&lt; 会更常见。默认情况下,标准算法将比较小于,而不是大于/等于。

    但是,如果您决定实现 operator&lt; 以与标准算法一起使用,您必须确保它执行“严格弱”比较,而您当前的比较不是(就目前而言,那里是 A 和 B 的值(例如,{4,5} 和 {5,4}),同时 A>=B 和 B>=A 将返回 false,表示 A 既不小于也不等于,也不大于 B。像这样的比较运算符可以(并且通常会)从排序算法之类的事物中产生未定义的行为。

    【讨论】:

    • 附带说明,这不是标准算法的有效比较运算符,因为Point(5,4) &gt;= Point(4,5) 是假的,Point(4,5) &gt;= Point(5,4) 也是假的。显然这两个点既不大于,也不小于或等于彼此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多