2012-05-11 11 views
11

ベクトルからオブジェクトの参照を返したいと思います。オブジェクトはイテレータオブジェクトにあります。どうやってやるの?イテレータからのオブジェクトの参照を返します

私は次のことを試みた:コードで

Customer& CustomerDB::getCustomerById (const string& id) { 
    vector<Customer>::iterator i; 
    for (i = customerList.begin(); i != customerList.end() && !(i->getId() == id); ++i); 

    if (i != customerList.end()) 
     return *i; // is this correct? 
    else 
     return 0; // getting error here, cant return 0 as reference they say 
} 

、CUSTOMERLISTは、顧客のベクター、及び顧客のIDを返すのgetId関数です。

*iは正しいですか?そして、0またはnullを参照として返すにはどうすればよいですか?

答えて

18

return *i;は正しいですが、0などの値を返すことはできません。ベクタに顧客が見つからない場合は、例外をスローすることを検討してください。

ベクトルの要素への参照を返すときにも注意してください。ベクトルに新しい要素を挿入すると、ベクトルがそのメモリを再割り当てして内容を移動する必要がある場合、参照が無効になります。

+0

また、ポインタを返すこともできます。 'return i!= customerList.end()の行に沿って何か? &* i:NULL; '。 –

+0

いくつかのiffyキャストを使用してnull参照を作成することは可能ですが、考えられる可能性のある状況ではUBと考えられます。 – BoBTFish

+0

ええ、それは機能の期待される使用に大きく依存します。関数を呼び出すときの最初の期待が、顧客が存在するはずであれば、例外をスローすることは理にかなっています。その目的が「顧客が存在するかどうか、顧客が存在する場合は顧客を返す」かどうかを問うことが多い場合は、null可能な型を返す方が理にかなっています。 –

3

"null"参照のようなものはありません:メソッドがベクトルにないIDを取得した場合、意味のある値を返すことはできません。また、@reko_tが指摘するように、ベクトルが内部を再割り当てするときに有効な参照が無効になることがあります。

しばらくの間有効である既存のオブジェクトへの参照を常に返すことができる場合にのみ参照戻り型を使用してください。あなたのケースではどちらも保証されません。

+0

+1(有効性の問題に言及する場合は、関数が参照、ポインタ、イテレータを返すかどうかに関係なく有効です)。 –

関連する問題