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保持していると思われます。その場合、これらのいずれかへのポインターが返される可能性があります。DataTypeNode::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 に答える