【问题标题】:operator overloading for pointer to struct结构指针的运算符重载
【发布时间】:2017-05-29 18:45:48
【问题描述】:

我正在尝试比较两个指向类中结构“节点”的指针的值。尽管我重载了

#include <iostream>
#include "compare.h"

struct Node {
    int value;
    bool operator >(const Node &n) { return value > n.value ; };
    bool operator <(const Node &n) { return value < n.value; };

};

int main()
{
    Node *a;
    a = new Node;
    a->value = 1;
    test<Node *> t;
    t.compare(a);
    delete a;
    return 0;
}

这里是 compare.h 文件:

template<class TYPE>
class test {
public:
    void compare(const TYPE n);
    test();
    ~test();
private:
    TYPE n;
};

template<class TYPE>
inline void test<TYPE>::compare(const TYPE a)
{
        if (n > a)
            std::cout << "n > a";
        else if (a>n)
            std::cout << "n < a";

}

template<class TYPE>
inline test<TYPE>::test()
{
    n = new Node;
    n->value = 2;
}

template<class TYPE>
inline test<TYPE>::~test()
{
    delete n;
}

【问题讨论】:

  • 欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。
  • 您的操作员接受const Node&amp;,而您传递的是const TYPE&amp;,但TYPE = Node* 而不是Node。使用TYPE = Node 并将TYPE* 作为test 中的参数。然后问问自己,当您分配n = new Node 时,其他TYPE 将如何工作。
  • 您正在比较Node*(即:指向节点的指针);所以你正在做的比较检查是检查内存地址是高于还是低于另一个。您可能想要使用test&lt;Node&gt; 以便比较Node ,或者您想要取消引用 compare 中的Node* (例如:if (*n &gt; *a)

标签: c++ pointers overloading operator-keyword


【解决方案1】:

这里你用模板参数Node*实例化test

test<Node *> t;

在您的 test::compare 函数中,您正在与模板参数进行比较

template<class TYPE>
inline void test<TYPE>::compare(const TYPE a)
{
        if (n > a)
            std::cout << "n > a";
        else if (a>n)
            std::cout << "n < a";
}

如果您将 TYPE 替换为您使用的参数 Node*,您将获得以下信息:

inline void test::compare(const Node* a)
{
        if (n > a)
            std::cout << "n > a";
        else if (a>n)
            std::cout << "n < a";
}

因此您可以看到您正在比较 Node* 值。这意味着您正在比较na内存地址

你可以通过取消引用指针来解决这个问题

template<class TYPE>
inline void test<TYPE>::compare(const TYPE a)
{
        if (*n > *a)
            std::cout << "n > a";
        else if (*a > *n)
            std::cout << "n < a";
}

【讨论】:

  • 说得好。我只想补充一点,OP 现在需要保持警惕,因为如果他们尝试为不可取消引用的类型调用 compare,他们会收到编译器错误。也许应该编写两个函数来处理这两种情况。
  • 非常感谢您优雅的解释。
  • @gru97 这是我的荣幸!
猜你喜欢
  • 1970-01-01
  • 2018-05-20
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多