我需要定义一个节点类,该类需要一个重载的'+'运算符函数,它返回两个节点的总和。
我很乐意这样做,但我不禁想知道为什么它应该返回一个双倍的总和,因此,不再可能为这个运算符链接。
我的意思是,node1 + node2
有效,但node1 + node2 + node3
不会。
如何利用重载的“+”运算符来实现5个节点的总和,并返回一个双倍?
编辑:
double Node::operator +(const Node& n) { return (this->weight + n.weight); }
答案 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 + double
和double + 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
时,您期望什么? Nodes
或double
?
因此,如果我必须这样做:
Node
见行动:Code