2012-05-09 2 views
0
//Node.cpp 

Node::Node(DataType Item):item(Item) 
{ 
    lchild = 0; 
    rchild = 0; 
} 

DataType Node::getItem() 
{ 
    DataType anItem = item; 
    return anItem; 
} 

void Node::setItem(const DataType & data) 
{ 
    item = data; 
} 

Node* Node::getLChild() const 
{ 
    Node * p = lchild; 
    return p; 
} 

void Node::setLChild(Node * p) 
{ 
    lchild = p; 
} 

Node* Node::getRChild() const 
{ 
    Node * p = rchild; 
    return p; 
} 

void Node::setRChild(Node * p) 
{ 
    rchild = p; 
} 

Node::~Node() 
{ 
} 

//BST.cpp 

DataType * BST::Search(const string name) 
{ 
    return Search(name, root); 
} 

DataType * BST::Search(const string name, Node * r) 
{ 
    if(r != 0) 
    { 
     if (name.compare(r->getItem().getname()) == 0) 
      return &(r->getItem()); 
     else 
     { 
      if (name.compare(r->getItem().getname()) < 0) 
       return Search(name, r->getLChild()); 
      else 
       return Search(name, r->getRChild()); 
     } 
    } 
    else 
     return NULL; 
} 

//main.cpp 

    MyClass mc1("Tree","This is a tree"); 
    MyClass mc2("Book","This is a book"); 
    MyClass mc3("Zoo","This is a zoo"); 

    BST tree; 
    tree.Insert(mc1); 
    tree.Insert(mc2); 
    tree.Insert(mc3); 

    MyClass * mc = tree.Search("Book"); 
    if (mc != NULL) 
     cout << mc->getname() << endl; 

검색 기능에서 반환 된 MyClass 개체 (mc)에 문제가 있습니다.이진 검색 트리 - 검색 함수 반환 개체

Search()로 추적하고 "r-> getItem()"이 원하는 것을 얻는 지 확인하십시오.

"& (r-> getItem()); return" ?

감사합니다. ++++++

나는 조금 혼란 스러워요 .. 내가 변경할 수 있습니다에 "데이터 형식 BST :: 검색 (const를 문자열 이름)"대신 "데이터 형식 * BST :: 검색의 (const string name) ".... 컴파일러가 통과 할 수없는 것 같습니다.

+0

'노드 ::의 getItem()'무엇을 반환하지? – juanchopanza

+0

getItem()이 MyClass (MyClass가 아닌)를 반환하면 "return & (r-> getItem());" 주소에 액세스 할 때 소멸되는 임시 객체에 주소를 반환합니다. 다른 반환 값은 컴파일러에 의해 차단되어야합니다. – stefaanv

답변

4

나는 Node::getItem() 그 반환 값에 의한 DataType 추측하고있다 :

DataType Node::getItem(); 

해당 반환 값의 주소를 가지고

, 당신은 본질적으로 즉시 (임시)를 사라집니다 뭔가의 주소를 복용을 . 나는 Node이 내부적으로 DataType 개체를 보유하고 있다고 의심합니다.이 경우 Node::getItem()은 이들 중 하나에 대한 포인터를 반환 할 수 있습니다.

DataType* Node::getItem() { return &item; } 
const DataType* Node::getItem() const { return &item; } 

또는 반환 참조 :

DataType& Node::getItem() { return item; } 
const DataType& Node::getItem() const { return item; } 
+0

을 참조하십시오. getItem 함수는 값의 데이터 사본을 반환하도록 코딩되어 있습니다. 사본도 함께 삭제해야하며 동일한 문제가 있습니다. –

+0

@MooingDuck 감사합니다. 구현을 보지 못했습니다. – juanchopanza

+0

내 문제를 해결해 주셔서 감사합니다 ... 포인터 문제를 분명히하는 것이 더 좋을 것 같습니다 ... 왜 값으로 복사를 사용할 수 없습니까? – user1371541

0

return &(r->getItem());를 반환합니다 반환 NULL 몇 가지 문제가됩니다 ...

는하지만 데이터 유형 * 노드 :: getIthem() 여전히 오류가 .... @@이를 변경하려면 방법을 시도 메모리 주소는 객체 자체가 아닌 r->getItem()이 반환합니다. r->getItem()이 포인터를 반환하면 return (r->getItem());이됩니다.

+0

물론 r-> getItem()이 참조를 반환하지 않는 한. 지도가 어떻게 작동하는지에 따라 괜찮을 수도 있습니다. – Lalaland

+0

"r-> getItem()"을 변경하면 "오류 C2440 : '반환': 'DataType'에서 'DataType *'으로 변환 할 수 없음" Node.cpp : 'DataType Node :: getItem() const { 데이터 유형 anItem = item; 반환 anItem; }' – user1371541

+0

@ user1371541 : "DataType Node :: getItem() const", juanchpanza의 답변 – stefaanv