C++ 参考的默认值,c++;

C++ 参考的默认值,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

所以我制作了一个链表,其中保存了我创建的类对象的引用

我想做一个方法,在链表中搜索,如果对象存在,则返回对该对象的常量引用,否则,如果对象不存在,则返回一些值

它应该是哪个值?若它是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 ???;
}

另外,成员对象是链接列表的成员。节点对象是链表的成员对象中的值。

在这种情况下,要么抛出异常,要么将函数改为通过指针返回。这里没有一个合理的方法返回“空”引用


或者采用标准库方法,通过值返回一个类似于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中使用它们。