2017-05-29 69 views
1

我想比较两个指针的结构“节点”在类中的值。尽管我重载了运算符<,但我不确定这是否是正确的方法,因为当我运行代码时,我有时会得到正确答案,有时它会比较错误。这是可能的比较价值属性这种方式? (我必须使用指向Node的指针,但我不能以其他方式执行)。为什么每次运行程序时结果都不一样? 感谢您的帮助!运算符重载指针结构

#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; 
} 
+0

欢迎堆栈溢出解决这个问题。请花些时间阅读[The Tour](http://stackoverflow.com/tour),并参阅[帮助中心](http://stackoverflow.com/help/asking)中的资料,了解您可以在这里问。 –

+0

你的运算符采用'const Node&',而你传递'const TYPE&',但是'TYPE = Node *'而不是'Node'。在'test'中使用'TYPE = Node'并将'TYPE *'作为参数。然后问你自己,当你分配'n = new Node'时,其他'TYPE'如何工作。 – BeyelerStudios

+1

您正在比较'Node *'(即:指向节点的指针);所以你要做的比较检查是检查内存地址是高于还是低于另一个。你会想要使用'test ',这样你就可以比较'Node' **值**,或者你想*取消引用'compare'中的'Node *'(例如:'if( * n> * a)') –

回答

3

在这里,我们用模板参数Node*

test<Node *> t; 

在你test::compare功能,你对比较实例test模板参数

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"; 
} 

如果您对您使用的参数,Node*替代TYPE,你会得到如下:

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"; 
} 
+1

说得好。我只是想补充一点,OP现在需要谨慎,因为如果他们尝试为非取消引用的类型调用'compare',它们会得到编译器错误。也许应该编写两个函数来处理这两种情况。 – AndyG

+0

非常感谢您的优雅解释。 – Gru97

+0

@ gru97这是我的荣幸! –