2016-04-20 27 views
0

にノードを挿入するためのものは私のクラスには、バイナリツリーのためのものです:演算子オーバーロード+ BinaryTree

class Node 
{ 
    friend class BinaryTree; 
    int value; 
    Node *left, *right; 
}; 

class BinaryTree 
{ 
private : 
    Node *first ; 
public : 
    void insert_node(int x); 
    void delete_node(int x); 
    void in_order_traversal(); 
    void print_leafs (Node *first); 
    void print_leafs2(); 
    int get_height(); 
    BinaryTree(); 
    ~BinaryTree(); 

    // operator oveloading 
}; 

私はので、私は、シーケンスがすべきツリーにつの新しい要素を挿入することができます+演算子をオーバーロードしたいですこのようなこと:

int x; 
BinaryTree *bt; 
x + bt; // or bt + x; 

私はすでにツリーにノードを挿入する方法を持っている、と私はしなければならないすべては、オーバーロード演算子+コードでそのメソッドを呼び出すことです。これは私がそれを実行しようとしました方法です:

//inline declaration 
friend BinaryTree& operator + (BinaryTree& bt, const int x) 
{ 
    bt.insert_node(x); 
    return bt; 
} 

私はなぜ知らないが、私はこのコードをデバッグするとき、ライン

bt + x; 

は、コンパイラによって無視されます。

任意の助けが理解されるであろう:)

+1

、それは非常に誤解を招く表記だから、それは動作しないことを喜んでいます。ほとんどのプログラマーは、 '+'が結果を生成することを期待しています。タイプミスとしてクローズする投票。 –

+0

あなたが実際にx + btを呼び出すと、あなたのコードは一貫していません。ここでbtはポインタですが、これはもちろんポインタシフトです!さらに、私は、より一般的に物事を追加するために使用されるように<<演算子を使用する – choosyg

+0

私はそれが木にノードを追加するために+演算子を使用することを知っているが、これは学校のためのプロジェクトであり、これはタスクでした: – Copacel

答えて

2

xためintbtはポインタにx + bt;又はbt + x;評価さを使用して、ポインタとして宣言され、値が破棄されるように宣言されます。

関数friend BinaryTree& operator + (BinaryTree& bt, const int x)を呼び出すには、演算子のLHSは、BinaryTreeへのポインタではなく、タイプBinaryTreeのオブジェクトでなければなりません。

*bt + x; 

だけ構文一部だこと:

あなたが使用する必要があります。意味論的に言えば、その演算子のオーバーロード関数は正しくはないようです。あなたは

int a = 10; 
a + 20; 

を使用する場合

aの値が変更されません。最後の行は単に30と評価され、値は破棄されます。

あなたは

int b = a + 20; 

bを使用している場合30の値を割り当てられますがaは変わらないされます。演算子のオーバーロード機能に類似したセマンティクスを作成することができます。その場合

BinaryTree bt1;    // Create an empty tree. 
BinaryTree bt2 = bt1 + 1; // bt2 contains everything in bt1 + 1. 

に機能を変更します。

friend BinaryTree operator + (BinaryTree const& bt, int x) 
//    |      |   ^^^ No need for const 
//    |      ^^^^^^^^ Change it to const& 
//    ^^^ Change the return type to be an object, not a reference.  
{ 
    BinaryTree ret(bt); // Provide a proper copy constructor 
    ret.insert_node(x); 
    return ret; 
} 
+0

ありがとう、それは働きます!:) – Copacel

+0

@CalinCretu、うれしく助けてくれました。 –