2012-04-30 16 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. Memberオブジェクトはリンクされたリストのメンバです。 NodeオブジェクトはリンクリストのMemberオブジェクトの値です。

+4

例外をスローすることができます。静的で意味的にnullの 'Node'への参照を返すことができます。 Boost.Optionalを使うことができます。あなたが決してしてはいけないことは、 'return *(Node *)0'です。 –

+0

代わりにポインタを返し、nullptrを使用するか、イテレータを返して、 "見つからない"という信号を送信します。 –

+2

参照は単にこれにはあまり適していません。 –

答えて

4

throwこの場合は例外です。代わりにポインタで返すように関数を変更してください。ここに「空の」参照を返す気の利いた方法はありません。

標準的なライブラリの方法をとって、インターレーターのようなプロキシを値で返すと、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.. 
    } 
}