//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() 它仍然有错误.... @@
答案 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());
。