2017-06-05 9 views
-1

C++の新機能、どこが間違っているのかわからない。まだptrsの周りに私の頭を包んでいる。ベクトル内のオブジェクトへのポインタを見つけて返す

私はプロファイルオブジェクトのベクトルを持っています。私はそのプロパティの1つに基づいて特定のオブジェクトを探したい。それから私はそのオブジェクトを返したい。オブジェクトのコピーや何かを作成したくないので、特定のオブジェクトへのポインタを返す必要があると思いますか?

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. ラムダパラメータを定数参照(const Profile &p)にしてください。これは上記の変更を行う場合にも必要です。

  3. 値でnameをキャプチャする必要はありません。参照でキャプチャすると、コピーが保存されます。 [&name]
+0

ありがとうございました。私はあなたが提案した変更を加えました。 1つの小さなものを除いてほとんど動作しています。何の無知を許して、私はそれはおそらくシンプルだが、ptrsについて学ぶことは私の頭がハハを傷つけていると思う。 このゲッターメソッドを使用しようとすると、変換エラーが発生します。 '' Profile :: getRealm ':' this 'ポインタを' const Profile 'から' Profile& ''に変換できません。 [ここで私が使っている方法](https://pastebin.com/0H05j2By)ここにコードを使用しています [コード。](https://pastebin.com/hyaZCTW4) 本当に助けていただきありがとうございます。 – user3238415

+0

@ user3238415ああ、私の一部の見落とし。 'getProfile'が' const'の場合、 'const Pointer *'を返さなければなりません。つまり、 'const'メソッドを呼び出すことしかできません。 –

+0

ご理解いただきありがとうございます。可能であれば、さらに1つ質問してください。私にはたくさんの読書があります。 :) あなたは私になぜそれがうまくいったのかを簡単に説明できますか?私の推測では、 '&'を追加すると、逆参照されたイテレータ自体の代わりに、逆参照されたイテレータのアドレスが返されるようになりました。私は閉じますか? :) – user3238415

関連する問題