所以我创建了一个链接列表,其中包含我创建的类对象的REFERENCES。
我想做一个方法,在链表中搜索并返回对象的const引用(如果它存在),否则,如果对象不存在,则返回SOME VALUE。
应该是哪个值?如果是int,我会返回0,如果是指针,我会返回NULL ....
const Node& NodeList::NodeNumSearch(int num) const
{
Member *TempHead=MemberHead;
while(TempHead!=NULL)
{
if(TempHead->GetNode().getNum() == num)
return TempHead->GetNode();
TempHead=TempHead->GetNext();
}
return ???;
}
P.S。 Member对象是链表的成员。 Node对象是链表的Member对象中的值。
答案 0 :(得分:4)
在这种情况下,throw
是异常,或者将函数更改为通过指针返回。这里没有一种理智的方式来返回“空”引用。
或者采用标准库方法并按值返回类似于类似interator的代理,然后可以检查它是否为end
。
答案 1 :(得分:2)
您可以将自己的NullNode定义为静态成员var并返回它。
// header
class NodeList
{
.....
static Node k_NullNode;
};
// cpp
/* static */ Node NodeList::k_NullNode; // you might need to pass a special argument to make it different from normal nodes.
const Node& NodeList::NodeNumSearch(int num) const
{
....
return k_NullNode;
}
// test
void test()
{
const Node& ret = NodeNumSearch(0);
if( ret == NodeList::k_NullNode ) // you might need to override == operator.
{
// failed to search..
}
else
{
// succeeded..
}
}
答案 2 :(得分:0)
我认为在C / C ++中,通常会传递一个指针来保存结果,并实际根据函数是否有效返回一个值。或者,如果它不起作用而不是传回一个默认对象,则应抛出异常。如果您希望其他代码使用默认值,则只返回默认值 - 对于看起来不太可能的搜索。
// Inject Node pointer to hold the reference
// Returns 1 if it worked, 0 otherwise
const int NodeList::NodeNumSearch(int num, Node* node) const
{
//your code here
}