2016-11-17 5 views
0

バイナリ検索ツリーの再帰的な挿入関数を作成しようとしています。しかし、私は次のエラーを取得し続ける "Nodeの*の値のアドレスを取ることができません"。ポインタがNULLの場合、そのアドレスを取ると私にこのエラーが出るはずですが、この問題を緩和するにはどうしたらいいですか?バイナリツリーの再帰関数でrvalueエラーのアドレスを取得できません。

注:Node(data * _data)コンストラクタは、オブジェクトの作成時に左と右のポインタをNULLに設定します。

ここに私のコードですが、私はrvalueエラーを生成している2つの行をコメントしました。私はXcodeも使用しています。

ありがとうございます。

class Node { 
private: 
data* data; 
Node* left; 
Node* right; 

public: 
Node(data* _data); 

~Node(); 

Node* getLeft(); // gets the left immediate descendent of the Node. 

Node* getRight(); // gets the right immediate descendent of the Node 

data* getVal(); //returns pointer to data 
}; 


class Tree { 

private: 
Node* root; 
int nodeCount; 
Node* placeNode(Node** root, data* data); 

public: 
Tree(); 

~Tree(); 

bool placeIn(data* newData); //placeIns node into ordered BST 
}; 


bool Tree::placeIn(data* newData) { 

return placeNode(root, newData); //placeIns newData object into BST 
} 


Node* Tree::placeNode(Node** root, data* data) { 
//placeIns node into BST via in order traversal 


if ((*root) == NULL) { 
    return (*root) = new Node(data); 
} 


if ((*root)->getVal()->getName() == data->getName()) { 
    cout << "Node exists" << endl; 
    return NULL; 
} 

if ((*root)->getVal()->getName() > data->getName()) { 
    placeNode(&(*root)->getLeft(), data); //Cannot take the address of an rvalue of type Node* 
} 

else { 
    placeNode(&(*root)->getRight(), data); //Cannot take the address of an rvalue of type Node* 
} 

return NULL; 
} 
+0

あるのでreturn root = new Node(data)は、コンパイルされません質問関連の問題)、エラーが何であるかは言わないので、助けが非常に難しいです。 https://godbolt.org/g/RZFQXK – xaxxon

+0

"rvalue error"はあまり説明的ではありません。 – xaxxon

+0

コードは私のプログラムの単純化されたバージョンです。私は上記を編集してエラーを正確に述べています。 – purpleScrn

答えて

0

getLeft()getRight()リターン右辺値、彼らはいくつかの他のオブジェクトのコピーである一時的なオブジェクトを返すという意味。あなたは一時的なアドレスを取ることはできません。

それはnew Node(data)式の結果に、一時的に設定します、その後、一時的に消えてしまうので、あなたのメモリリーク、placeNode機能が有用何もしないだろう、それらの一時のアドレスを取ることができれば作成したばかりの新しいNodeエラーは、壊れたコードをコンパイルすることを拒否することによって、あなたに好意を与えています。

メンバー変数leftrightを新しいノードに設定する場合は、それらの変数の一時コピーを設定しないでください。これを行うには、getLeftgetRightを、メンバー変数のコピーではなく、メンバー変数への参照またはポインタに戻す必要があります。メンバ変数のアドレスを返すか(一時コピーのアドレスを取るのではなく)、またはより慣用的なC++の場合は、メンバ変数への参照を返し、をNode*&でなくNode*に変更します。代わりにsetLeft()setRight()メンバ関数を提供し、getterは変更しないでください。

コードには他にもエラーがあります。 rootはあなたのコードが原因以外に(コンパイルできないNode**ないNode*(あなたがそれを間接参照に意味した?あなたはそれがNode*&、あなたがする必要はありません作る場合。)

+0

次に、http://stackoverflow.com/help/someone-answersを読んでください。 –

関連する問題