图节点的重载运算符

问题描述 投票:0回答:2

我想通过重载

+
运算符来为图形的两个节点定义加法。但是,我收到以下我不明白的错误:

error: invalid operands of types ‘Node*’ and ‘Node*’ to binary ‘operator+’
   30 |     c = a + b;
      |         ~ ^ ~
      |         |   |
      |         |   Node*
      |         Node*

我尝试通过实施

add()
方法在两个图节点上执行加法,这似乎工作正常。为什么同样的方法在我尝试实施时不起作用
operator+()

这是我的代码:

#include <iostream>

class Node {
    public:
        double data;
        Node () {}
        Node (double x) : data(x) {}
        Node* add(Node *rhs);
};

// Works
Node* Node::add(Node *rhs) {
    Node* value = new Node();
    value->data = this->data + rhs->data;
    return value;
}

// Does not work
// Node* operator+ (Node* lhs, Node* rhs) {
//     Node* value = new Node();
//     value->data = lhs->data + rhs->data;
//     return value;
// }

int main(void) {

    Node* a = new Node(2.0);
    Node* b = new Node(3.0);

    Node* c = nullptr;
    c = a->add(b); // this works
    // c = a + b;  // does not work
    std::cout << c->data << "\n";

    delete a;
    delete b;
    delete c;

    return 0;
}

我用

编译了上面的例子

g++ -std=c++20 -O -Wall -Wextra -Wpedantic graph.cc

c++ operator-overloading
2个回答
0
投票

您需要为您的类类型重载 + 运算符。运算符函数的参数是指针。

您可以在here阅读有关内容。还有一个重载 + 运算符的示例。

当一个运算符出现在一个表达式中,并且它的操作数中至少有一个是类类型或枚举类型时,则使用重载决议来确定要在所有签名符合以下条件的函数中调用的用户自定义函数:请参阅链接中的表格。

要解决这个问题,你可以写:

#include <iostream>

class Node {
public:
    double data{};
    Node() {}
    Node(double x) : data(x) {}
    Node* add(Node* rhs);
};

// Works
Node* Node::add(Node* rhs) {
    Node* value = new Node();
    value->data = this->data + rhs->data;
    return value;
}
Node* operator+ (const Node& lhs, const Node& rhs) {
    Node* value = new Node();
    value->data = lhs.data + rhs.data;
    return value;
}
//Does not work

int main(void) {

    Node* a = new Node(2.0);
    Node* b = new Node(3.0);

    Node* c = nullptr;
    //c = a->add(b); // this works
    c = *a + *b;  // does not work
    std::cout << c->data << "\n";

    delete a;
    delete b;
    delete c;

    return 0;
}

0
投票

不可能为指针重载 + 运算符(这会干扰正常的指针算法,请参阅更多详细信息here)。因此,重载函数需要采用

Node
值或引用。

问题中的

Node
类非常小,不值得使用动态内存分配或通过引用传递对象。

总而言之,实现可以修改如下:

#include <iostream>

class Node {
    public:
        double data;
        Node () {}
        Node (double x) : data(x) {}
        // friend Node operator + (Node a, Node b); // Needed if "data" was private or protected
};

Node operator + (Node a, Node b)
{
    return Node(a.data + b.data);
}

int main(void) {

    Node a(2.0);
    Node b(3.0);

    Node c = a + b;
    
    std::cout << c.data << "\n";

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.