2012-04-30 63 views
0

所以我做了一個鏈接列表,它包含我創建的類對象的REFERENCES。引用的默認值,C++

我想做一個方法,在鏈表中搜索並返回一個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.成員對象是鏈接列表的成員。而Node對象是鏈接列表成員對象中的值。

+4

你可以拋出一個異常。你可以返回一個靜態的,在語義上爲null的節點的引用。你可以使用Boost.Optional。你永遠不會做的是'return *(Node *)0'。 –

+0

或者返回一個指針,並使用nullptr,或者返回一個迭代器,並使用一次過的結束來表示「找不到」。 –

+2

參考文獻根本不適用於此。 –

回答

4

throw在這種情況下是一個異常,或者改變你的函數返回指針來代替。在這裏沒有一個合理的方式來返回一個「空的」參考。

或者採用標準庫方法並按值返回類似於interator的代理,然後您可以檢查它是否爲end

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 
} 
+0

這將是C的方式,但通常不會在其他方法(如異常)存在的C++中使用。 –

+0

夠公平的。我是一個例外的粉絲,但主要在Java中使用它們。 –

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.. 
    } 
}