2017-05-29 71 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這是我的榮幸! –