C ++用户定义的运算符<不正常

时间:2014-03-22 03:04:28

标签: c++ operator-overloading nodes

我有一个结构节点,我想定义运算符<为了在我的斐波那契堆中使用节点。

这是我的简单节点:

struct Node {
    int key, data;
    Node* parent;
    Node(int aKey, int aData):key(aKey),data(aData),parent(nullptr) {}

    bool operator<(const Node* n) const {
        return n->key > key;
    }
}

确保运营商&lt;工作,我测试了它:

Node* n = new Node(100, 0);
Node* m = new Node(1, 1);

cout << (n < m) << endl;
cout << (n > m) << endl;

我得到的答案是:

1
0

但是,我怀疑这是错误的,所以我稍微修改了我的节点:

struct Node {
    int key, data;
    Node* parent;
    Node(int aKey, int aData):key(aKey),data(aData),parent(nullptr) {}

    bool operator<(const Node* n) const {
        cout << "comparing.... " << endl;
        return n->key > key;
    }
}

然后我又做了同样的测试,“比较....”从未打印出来。因此,出于某种原因,当我尝试比较节点时,它不使用我定义的比较器运算符。相反,在我看来比较指针。我该如何解决?我知道“替代”将是创造类似的东西:

struct NodeComp(Node* a, Node* b) {
     ....
}

但是,这对我实现Fibonacci Heap不起作用,最终我想将节点插入斐波那契堆中。

感谢。

2 个答案:

答案 0 :(得分:2)

正常使用operator<涉及传递const引用参数,而不是指针:

bool operator<(const Node& n) const {  // Note the & instead of the *
    return n.key > key;
}

然后,您可以先通过解除引用来比较Node指针:

cout << (*n < *m) << endl;

无论如何,如果您只定义了>,那么您将不会让<工作 - 您需要如果您希望能够编译operator>等表达式,还会重载(*n > *m)

答案 1 :(得分:1)

如果要重载operator<(),则需要将其作为类的成员:

bool operator<(Node &n);

它也可以是一个独立的功能:

// this function should be made a friend of you class if you need to
// access private class members
bool operator<(Node &left, Node &right);

请注意,对象的引用将传递给您的函数,而不是指针。

您需要将代码重写为:

cout << (*n < *m) << endl;
cout << (*n > *m) << endl;