C++ 参考的默认值,c++;
所以我制作了一个链表,其中保存了我创建的类对象的引用 我想做一个方法,在链表中搜索,如果对象存在,则返回对该对象的常量引用,否则,如果对象不存在,则返回一些值 它应该是哪个值?若它是int,我将返回0,若它是指针,我将返回NULLC++ 参考的默认值,c++;,c++,reference,return,default,C++,Reference,Return,Default,所以我制作了一个链表,其中保存了我创建的类对象的引用 我想做一个方法,在链表中搜索,如果对象存在,则返回对该对象的常量引用,否则,如果对象不存在,则返回一些值 它应该是哪个值?若它是int,我将返回0,若它是指针,我将返回NULL const Node& NodeList::NodeNumSearch(int num) const { Member *TempHead=MemberHead; while(TempHead!=NULL) { if(T
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 ???;
}
另外,成员对象是链接列表的成员。节点对象是链表的成员对象中的值。在这种情况下,要么抛出异常,要么将函数改为通过指针返回。这里没有一个合理的方法返回“空”引用
或者采用标准库方法,通过值返回一个类似于interator的代理,然后可以检查它的
end
ness。在这种情况下,要么抛出一个异常,要么将函数改为通过指针返回。这里没有一个合理的方法返回“空”引用
或者采用标准库方法,通过值返回一个类似于interator的代理,然后可以检查它的end
ness。我认为在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
}
我认为在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
}
您可以将自己的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..
}
}
您可以将自己的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..
}
}
您可以抛出一个异常。您可以返回对静态、语义为空的节点的引用。您可以使用Boost.Optional。你永远不能做的是<代码>返回*(节点*)0 < /C>。或者返回一个指针,使用Null pTR,或者返回一个迭代器,并使用一个结束的信号来指示“未找到”。引用不适合这个。是的,指针在这种情况下更有意义。C++中;拥有一个引用意味着拥有一个对象。如果函数返回一个引用,它将保证该引用将引用一个有效的对象。如果希望返回NULL
,则返回一个指针(或其他人指出的迭代器,但指针类似于迭代器)。您可以抛出一个异常。您可以返回对静态、语义为空的节点的引用。您可以使用Boost.Optional。你永远不能做的是<代码>返回*(节点*)0 < /C>。或者返回一个指针,使用Null pTR,或者返回一个迭代器,并使用一个结束的信号来指示“未找到”。引用不适合这个。是的,指针在这种情况下更有意义。C++中;拥有一个引用意味着拥有一个对象。如果函数返回一个引用,它将保证该引用将引用一个有效的对象。如果你想返回<代码> null < /C>,你返回一个指针(或者一个迭代器,正如其他人指出的,但是指针又像一个迭代器)。这是C的方式,但是在C++中通常不使用其他方法,比如异常。我是异常的爱好者,但大多数都在java中使用它们。这是C的方式,但C++中通常不使用其他方法,比如异常。我是异常的粉丝,但我主要在Java中使用它们。