二叉搜索树 - 搜索函数返回对象(C ++)

时间:2012-05-09 13:27:29

标签: c++ search binary-search-tree

//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-&gt; getItem()”得到我想要的东西。

“return&amp;(r-&gt; getItem());” ?

谢谢!

++++++

我有点困惑..我可以改为“DataType BST :: Search(const string name)” 而不是“DataType * BST :: Search(const string name)”....似乎编译器无法通过。 返回NULL会有一些问题......

但我尝试你的方法来改变DataType * Node :: getIthem() 它仍然有错误.... @@

2 个答案:

答案 0 :(得分: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; }

答案 1 :(得分:0)

return &(r->getItem());会将内存地址返回到r->getItem()返回的任何内容,而不是对象本身。 如果r->getItem()返回指针,则必须return (r->getItem());