2012-05-09 43 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)です。バイナリ検索ツリー - 検索関数returnオブジェクト(C++)

私はSearch()にトレースし、 "r-> getItem()"が必要なものを取得していることを確認します。

"返品&(r-> getItem());" ?

ありがとうございます!代わりに、データ型* BST」の

++++++

私は少し混乱しています..私は、「データ型BST ::検索(定数文字列名)」に変更することができます ::検索( const string name) "....コンパイラが通過できないようです。 リターンNULLは、いくつかの問題を抱えているだろう...

が、私は、データ型*ノード:: getIthemを(変更するには、あなたの方法を試してみてください) 、それはまだエラーを持っている.... @@

+0

'ノード::のgetItem()'何を返すのでしょうか? – juanchopanza

+0

getItem()がMyClass(MyClass&ではない)を返し、 "return&(r-> getItem());"一時オブジェクトにアドレスを返します。一時オブジェクトはアクセス時に破棄されます。他のリターンはコンパイラによってブロックされるべきです。 – stefaanv

答えて

4

私はNode::getItem()その戻り値によってDataType推測しています:

DataType Node::getItem(); 

あなたはその戻り値のアドレスを取る

が、あなたは基本的にすぐに(一時的に)消えてしまいます何かのアドレスを取っているが。私は NodeDataTypeオブジェクトを内部的に保持していると思われます。この場合、 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());が返されますメモリアドレスは、オブジェクト自体ではなく、r->getItem()が返します。 r->getItem()がポインタを返す場合は、return (r->getItem());にする必要があります。

+0

もちろん、r-> getItem()は参照を返します。そうすれば、地図の仕方によっては大丈夫かもしれません。 – Lalaland

+0

"r-> getItem()"を変更すると "エラーC2440: 'return': 'DataType'から 'DataType *'に変換できません" Node.cpp is: 'DataType Node :: getItem()const { データ型anItem = item;返品anItem; ; } ' – user1371541

+0

@ user1371541:" DataType Node :: getItem()const "、juanchpanzaの回答 – stefaanv