2017-06-05 133 views
-1

剛接觸C++,並不確定我要去哪裏錯了。仍圍繞ptrs包裹我的頭。找到並返回一個指向一個向量中的對象的指針

我有一個配置文件對象的向量。我想根據它的一個屬性找到一個特定的對象。然後我想要返回該對象。我不想製作副本或任何對象,所以我想我需要返回一個指向特定對象的指針?

這裏是我的代碼:

Profile* profileManager::getProfile(const std::string& name) 
{ 
    std::vector<Profile>::iterator it = std::find_if(allProfiles.begin(), allProfiles.end(), [name](Profile &p) { return p.getName() == name; }); 
    return it != allProfiles.end() ? *it : nullptr; 
} 

有幾件事情錯了,我不知道如何解決了。如果找不到匹配並讓調用者處理它,我想返回null,那麼我該怎麼做?目前我遇到了一種不兼容的類型,我試圖改變它的迴歸,但沒有運氣。它也說它不是正確的類型。如果發現它,我如何獲得它返回指向配置文件的指針?

任何幫助/建議表示讚賞。謝謝。

+0

如果'* it'是'Profile',你將如何得到'Profile *'?除此之外,它看起來是對的。 –

+0

具有完整意義,我正在打破我的頭閱讀ptrs。 – user3238415

+0

由於它不是配置文件ptrs的向量,只是配置文件對象的向量,我只需要返回配置文件對象。我是通過引用的方式做到這一點,沒有額外的副本,一切都很好? – user3238415

回答

3
return it != allProfiles.end() ? *it : nullptr; 

這幾乎是你想要的。 *it的類型是Profile。爲了得到一個指針,只需要地址:&*it

此外,一些建議的更改。

  1. 使getProfile成爲一個不變的方法。它不(也不應該)修改任何東西
    有一個不斷超載getProfile是一個好主意,但你也想保持可變的。

  2. 將lambda參數設爲常量參考(const Profile &p)。如果您進行上述更改,這也是必需的。

  3. 您不需要按價值捕獲name。通過引用捕獲可節省複製。 [&name]
+0

非常感謝。我做了你所建議的改變。 我幾乎有它的工作,除了一件小事。請原諒任何無知,我敢肯定它可能很簡單,但瞭解ptrs正在讓我的頭部受傷。 當我嘗試使用此getter方法時,出現轉換錯誤。 ''Profile :: getRealm':無法將'this'指針從'const Profile'轉換爲'Profile&' [以下是我如何使用它](https://pastebin.com/0H05j2By)這裏是我使用的代碼 [代碼](https://pastebin.com/hyaZCTW4) 我真的很感激任何幫助。 – user3238415

+0

@ user3238415啊,我的一個疏忽。如果'getProfile'爲'const',則必須返回一個'const Pointer *',這意味着您只能在其上調用'const'方法。 –

+0

感謝您的耐心等待。如果可能,還有1個問題。我有很多閱讀要做。 :) 你能給我一個快速解釋爲什麼'&* it'使它工作?我的猜測是,添加'&'就是這樣,它返回了去相關迭代器的地址,而不是取消引用迭代器本身,這是一個對象。我關門了嗎? :) – user3238415

相關問題