【问题标题】:C++ Forward Declaration of Overloaded Operators重载运算符的 C++ 前向声明
【发布时间】:2014-09-01 07:05:30
【问题描述】:

我在论坛上发现了一个问题,我决定编写一个快速代码。我决定借此机会自学有关重载比较运算符的知识。不幸的是,我似乎犯了一个错误。

我正在尝试与 Quadrilateral 类中的 Line 对象进行比较。我不断收到错误消息,指出Line 是二元运算符< 的无效操作数。我尝试向前声明重载的运算符,但这似乎没有帮助。任何人都可以提出比较不起作用的原因吗?非常感谢任何帮助:)

(重载的操作符函数是代码中的最后一个函数,实际比较发生在Quadrilateral类中)

#include <iostream>
#include <vector>
#include <cmath>

class Point {
private:
  int x, y;
public:
  Point(): x(0), y(0) {}
  Point(int x, int y): x(x), y(y) {}

  int getX() const { return x; }
  int getY() const { return y; }

  friend std::ostream& operator<<(std::ostream& stream, const Point& pt);

};

class Line {
private:
  Point pt1, pt2;
public:
  Line(): pt1(0,0), pt2(0,1) {}
  Line(const Point& pt1, const Point& pt2): pt1(pt1), pt2(pt2) {}

  friend auto operator<(const Line& ln1, const Line& ln2) -> bool;

  friend std::ostream& operator<<(std::ostream& stream, const Line& ln);
};

class Quadrilateral {
private:
  Point pt1, pt2, pt3, pt4;
public:
  Quadrilateral(): pt1(0,0), pt2(0,1), pt3(1,0), pt4(1,1) {}
  Quadrilateral(const Point& pt1, const Point& pt2,
                const Point& pt3, const Point& pt4): pt1(pt1), pt2(pt2),
                                                     pt3(pt3), pt4(pt4) {}

  auto getAllLines() const -> std::vector<Line> {
    std::vector<Line> quadLines;
    Line l1(pt1,pt2), l2(pt2,pt3), l3(pt3,pt4), l4(pt4,pt1);
    quadLines.push_back(l1); quadLines.push_back(l2);
    quadLines.push_back(l3); quadLines.push_back(l4);
    return quadLines;
  }

  auto longestSide() const -> Line {
    Line l1(pt1,pt2), l2(pt2,pt3), l3(pt3,pt4), l4(pt4,pt1);
    return (l1 > l2 ? l1 : l2);
  }

  friend std::ostream& operator<<(std::ostream& stream, const Quadrilateral& q);

};

std::ostream& operator<<(std::ostream& stream, const Point& pt) {
  stream << "(" << pt.x << ", " << pt.y << ")";
  return stream;
}

std::ostream& operator<<(std::ostream& stream, const Line& ln) {
  stream << ln.pt1 << " <-> " << ln.pt2 << std::endl;;
  return stream;
}

std::ostream& operator<<(std::ostream& stream, const Quadrilateral& q) {
  stream << q.pt1 << "\t" << " <-> " << "\t" << q.pt2 << "\n"
     << "  ^" << "\t" << "\t" << "  ^" << "\n"
     << "  |" << "\t" << "\t" << "  |" << "\n"
     << "  v" << "\t" << "\t" << "  v" << "\n"
     << q.pt4 << "\t" << " <-> " << "\t" << q.pt4 << "\n"
     << std::endl;
  return stream;
}

auto operator<(const Line& ln1, const Line& ln2) -> bool {
  double ln1_len = sqrt( pow((ln1.pt1.getX() - ln1.pt2.getX()),2) - pow((ln1.pt1.getY() - ln1.pt2.getY()),2) );
  double ln2_len = sqrt( pow((ln2.pt1.getX() - ln2.pt2.getX()),2) - pow((ln2.pt1.getY() - ln2.pt2.getY()),2) );
  return ln1_len < ln2_len;
}

【问题讨论】:

  • 哪一行导致错误?
  • 两个旁白:1) 我觉得&lt; 比较两行的长度 并不直观。 2)如果要比较长度,则无需取平方根。 (假设一切都是 +ve),您可以只比较平方和并节省一些昂贵的操作。
  • @PhilipKendall 是的,你绝对是对的。我只是累了,我的大脑又回到了距离函数风靡一时的二年级。 :)
  • 这是一个最小的例子... ;)
  • 我不知道你为什么要为 boolLine 之类的东西使用尾随返回类型。

标签: c++ class operator-overloading forward-declaration


【解决方案1】:

我假设return (l1 &gt; l2 ? l1 : l2); 会导致错误。请注意,您在这里使用的是&gt;,但您只定义了operator&lt;()

【讨论】:

  • 哈哈哈!哇,谢谢...我的眼睛下垂了,应该已经发现了,但是在解决它之前我无法入睡。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2013-12-08
相关资源
最近更新 更多