2012-05-11 28 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是客戶的一個載體,而返回的getId顧客的ID的功能。

*i是否正確?我怎樣才能返回0或null作爲參考?

回答

18

return *i;是正確的,但是您不能返回0或任何其他此類值。如果客戶在向量中找不到,請考慮拋出異常。

在向量中返回對元素的引用時還要小心。如果向量需要重新分配內存並移動內容,則向量中插入新元素會導致引用無效。

+0

或者,他可以返回一個指針。沿着'return i!= customerList.end()的方向行嗎? &* i:NULL;'。 –

+0

這是幾乎可以創建一個空引用一些iffy鑄造,但一個*真的*壞主意,最有可能在幾乎所有可能的情況下UB。 – BoBTFish

+0

是的,這取決於該功能的預期用途。如果調用函數的初始期望是客戶應該存在,那麼拋出異常是有道理的。如果它的目的更多的是要問「客戶是否存在,如果是,返回客戶」,那麼返回可空類型更有意義。 –

3

沒有「null」引用這樣的事情:如果你的方法得到一個不在向量中的id,它將無法返回任何有意義的值。正如@reko_t指出的那樣,即使一個有效的引用可能會在向量重新分配其內部時失效。

當您始終可以返回對現有對象的引用並保持一段時間有效時,您應該只使用引用返回類型。在你的情況下,都沒有保證。

+0

+1表示有效性問題(無論函數是否返回引用,指針或迭代器都是有效的)。 –