2016-11-17 1 views
0

Я пытаюсь создать рекурсивную функцию вставки для моего дерева двоичного поиска. Однако я продолжаю получать следующую ошибку: «Невозможно принять адрес rvalue типа Node *». Я понимаю, что если мой указатель имеет значение NULL, то, принимая его адрес, он даст мне эту ошибку, но как бы я решил смягчить эту проблему?Не удается получить адрес ошибки rvalue в рекурсивной функции для двоичного дерева

Примечание: Конструктор узла (data * _data) устанавливает указатель слева и справа в NULL, когда объект создан.

Вот мой код, я прокомментировал две строки, которые производят ошибку rvalue. Я также использую 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

ваш код не компилируется (в связи с неуплатой - вопросы, связанные с вопросами), и вы не говорите, что такое ошибка, поэтому ее очень сложно помочь. https://godbolt.org/g/RZFQXK – xaxxon

+0

«Ошибка rvalue» не очень описательна. – xaxxon

+0

Код - это просто упрощенная версия моей программы. Я отредактировал выше, который теперь точно указывает ошибку. – purpleScrn

ответ

0

getLeft() и getRight() возвращение rvalues ​​означает, что они возвращают временный объект, который является копией какого-либо другого объекта. Вы не можете принять адрес временного.

Если вы могли взять адрес этих временных, функция placeNode не ничего полезного не сделает, потому что это было бы установить временные к результату выражения new Node(data), а затем временно исчезнет, ​​утечка памяти новый узел, который вы только что создали. Ошибка делает вам одолжение, отказываясь компилировать сломанный код.

Если вы намерены установить переменные-члены left и right в новый узел, вам необходимо сделать это, а не установить временную копию этих переменных. Для этого вам нужно сделать getLeft и getRight вернуть ссылку или указатель на переменные-члены, а не их копию. Либо верните адрес переменной-члена (вместо того, чтобы взять адрес временной копии), либо для более идиоматического C++ верните ссылку на переменные-члены и измените значение placeNode, чтобы принять Node*& не Node*. Или укажите setLeft() и setRight() функции-члены вместо этого, и оставить геттеры без изменений.

В коде все еще есть другие ошибки, например. return root = new Node(data) не будет компилироваться, потому что root является Node** не Node* (вы имели в виду разыменовать это? Если вы сделаете это Node*&, то вам не нужно.)

+0

Затем, пожалуйста, прочитайте http://stackoverflow.com/help/someone-answers –

Смежные вопросы