2016-11-17 4 views
0

내 바이너리 검색 트리에 대한 재귀 적 삽입 기능을 만들려고합니다. 그러나 다음과 같은 오류가 발생합니다. "Node * 유형의 rvalue 주소를 가져올 수 없습니다." 나는 내 포인터가 NULL이라면 그 주소를 가지고 나에게이 오류를 줄 것이라고 생각하지만 어떻게이 문제를 완화 할 수 있을까?이진 트리에 대한 재귀 함수에서 rvalue 오류의 주소를 가져올 수 없습니다.

참고 : Node (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 error"는 매우 설명 적이 지 않습니다. – xaxxon

+0

코드는 내 프로그램의 단순화 된 버전입니다. 위의 내용을 편집하여 오류를 정확하게 설명합니다. – purpleScrn

답변

0

getLeft()getRight() 반환 우변은, 의미 그들은 다른 객체의 복사본입니다 임시 오브젝트를 돌려줍니다. 임시 주소는 사용할 수 없습니다. 당신 그 임시 변수의 주소를 취할 수 있다면 그것은 new Node(data) 식의 결과에 임시을 설정합니다 다음 임시가 사라질 것이기 때문에

placeNode 기능의 메모리가 누수, 유용한 아무것도 할 것 방금 작성한 새로운 Node 오류는 깨진 코드를 컴파일하는 것을 거부하여 부탁합니다.

회원 변수 leftright을 새 노드에 설정하려는 경우 해당 변수의 임시 복사본을 설정하지 말고이를 수행해야합니다. 그렇게하려면 getLeftgetRight을 참조하거나 구성원 변수에 대한 포인터가 아니라 참조를 반환해야합니다. (임시 복사본의 주소를 가져 오는 대신) 멤버 변수의 주소를 반환하거나 더 많은 관용적 인 C++의 경우 멤버 변수에 대한 참조를 반환하고 을 Node*&이 아닌 Node*으로 변경하십시오. 또는 대신 setLeft()setRight() 멤버 함수를 제공하고 getter는 변경되지 않은 상태로 둡니다.

코드에 여전히 다른 오류가 있습니다 (예 : rootNode**하지 않기 때문에 return root = new Node(data)는 컴파일되지 않습니다 Node* (당신이이 Node*&가 다음에 필요하지 않습니다 할 경우에 당신은? 그것이 역 참조로 의미 않았다.)

+0

다음 http://stackoverflow.com/help/someone-answers를 읽어보십시오. –