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;

问题出在 Search 函数返回的 MyClass 对象 (mc) 上。

我追踪到 Search() 并确保“r->getItem()”得到我想要的。

“return &(r->getItem());”有什么问题 ?

谢谢!

++++++

我有点困惑..我可以更改为“DataType BST::Search(const string name)”而不是“DataType * BST::Search(const string name)”....看来编译器不能经过。返回 NULL 会有一些问题...

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

4

2 回答 2

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; }
于 2012-05-09T13:45:51.917 回答
0

return &(r->getItem());将内存地址返回给任何r->getItem()返回,而不是对象本身。如果r->getItem()返回一个指针,你将不得不return (r->getItem());.

于 2012-05-09T13:35:04.270 回答