2017-05-29 8 views
1

クラス内の構造体 "Node"への2つのポインタの値を比較しようとしています。 <演算子がオーバーロードされましたが、コードを実行するときに正しい答えが得られることがあり、時には誤って比較することがあるため、正しい方法であるかどうかはわかりません。この方法で値のプロパティを比較することは可能ですか? (私はノードへのポインタを使用する必要があります、私は他の方法で行うことはできません)。プログラムを実行するたびに結果が異なるのはなぜですか? 助けてくれてありがとう!ここでは、あなたのtest::compare機能でテンプレートパラメータを持つtestNode*構造体へのポインタの演算子オーバーロード

test<Node *> t; 

をインスタンス化している

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'ではありません。 'TYPE = Node'を使って、' test'であなたの引数として 'TYPE *'を取ってください。 'n = new Node'を指定すると、他の' TYPE'がどのように動作するのか、自分自身に尋ねます。 – BeyelerStudios

+1

'Node *'(つまり、ノードへのポインタ)を比較しています。あなたがやっている比較チェックは、メモリアドレスが別のものより高いか低いかをチェックすることです。 'test 'を使って 'Node' **値**を比較するか、' compare'の 'Node *'を* dereference *したいと思うでしょう( 'if( * n> * a) ') –

答えて

3

、あなたはに対して比較している:ここで

#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> 
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'を呼び出そうとすると、コンパイラエラーが発生するからです。両方のシナリオを処理するために、おそらく2つの関数を記述する必要があります。 – AndyG

+0

あなたの優雅な説明に感謝します。 – Gru97

+0

@ gru97それは私の喜びです! –

関連する問題