链接不返回对象的运算符

时间:2015-04-24 03:34:02

标签: c++

我需要定义一个节点类,该类需要一个重载的'+'运算符函数,它返回两个节点的总和。

我很乐意这样做,但我不禁想知道为什么它应该返回一个双倍的总和,因此,不再可能为这个运算符链接。

我的意思是,node1 + node2有效,但node1 + node2 + node3不会。

如何利用重载的“+”运算符来实现5个节点的总和,并返回一个双倍?

编辑:

double Node::operator +(const Node& n) { return (this->weight + n.weight); }

4 个答案:

答案 0 :(得分:3)

有两种选择。要么你有" double + node",你理解这意味着什么,或者你不能从运营商那里返回一个双精神。

我会详细说明。 C ++中没有tretinary operator +(我也不知道其他任何语言)。您的node1 + node2 + node3实际上是(node1 + node2)+ node3。让运算符编号,以便于参考,p1和p2(左边是p1,右边是p2)。

现在你必须决定哪个更有意义。特别是,在查看"节点"的语义时。意味着做" 2.3 +节点"?如果是这样,只需定义一个接受一个节点和一个双精度的运算符+,然后完成它。

更进一步,如果节点的值超出其值,则可以创建一个接受double的节点构造函数,从而创建从double到节点的隐式转换。

替代方案是说" double + node"没有意义。也许一个节点有很多方面,它的价值只是其中之一。如果是这种情况,并且有一些有意义的方式可以添加"两个节点,然后你需要你的operator +来返回一个节点。没办法。

然后有第三个选项。如果没有办法添加两个节点并获得第三个节点,但是在使用" double + node"时也没有任何意义,那么你需要一个代理类。

class node {
private:
  class node_value {
  public:
    double value;
    operator double() { return value; }
  }

  node_value operator+( const node &rhs );
  node_value operator+( const node_value &rhs );
};

operator + for node返回一个代理类,可以隐式转换为double。它定义了主要加法的第一种形式的运算符+,以及链式加法的第二种形式。当然,您还需要在类外部定义的交换参数运算符。

答案 1 :(得分:1)

如果您还实现了一个强制转换操作符,例如operator double(),您可以隐式转换链接添加的结果,以下内容应该有效:

Node a(3.0);
Node b(7.0);
Node c(24.0);
double x = a + b + c;

答案 2 :(得分:0)

如果可以添加节点和双精度,则可以通过定义节点和双精度的添加来支持多个添加:

class Node {
  public:
    friend double operator+(double a, Node &b);
    double operator+(double b) {
      // however you get the sum here
      // for example, if the sum is a field of the node:
      return this->weight + b;
    }
}
double operator+(double a, Node &b) { return b + a; }

请注意,我们必须同时定义Node + doubledouble + Node,以便除了a + (b + c)之外还支持(a + b) + c之类的内容。

编辑:为了响应您的编辑,我更新了代码。

答案 3 :(得分:0)

对于链接,您可以覆盖operator double的{​​{1}},例如

Node

然后你可以这样做:

struct Node {
   double operator+(const Node & n) const {
       return n.val + val;
   }

   Node(double val) : val(val) {}

   operator double() {
      return val;
   }

   double val;
};

但这会引起读者的困惑。为什么?当您添加两个Node n1(1); Node n2(2); Node n3(3); std::cout << n1 + n2 + n3 << endl; // 6 时,您需要ints。当您添加两个int时,您期望什么? Nodesdouble

因此,如果我必须这样做:

Node

见行动:Code