私はC#アプリケーションをC ++に移植しており、次のクラスがあります(Boxは構造体であり、BoxStoreはアプリ内のグローバルで長寿命のオブジェクトになります)。
public class BoxStore
{
private List<Box> boxes;
...
public List<Box> GetBoxes()
{
return this.boxes;
}
}
ボックスコレクションをC++のstd::vectorに格納することを計画しています。コレクションを定義する方法は複数あります。
std::vector<Box> boxes;
shared_ptr<std::vector<Box>> boxes;
std::vector<Box>& boxes;
(*std::vector<Box> boxes;)
-もしあれば-最善の方法は何ですか?最後のオプション(コレクションへの生のポインターを格納する)は、何のメリットもない最悪の解決策だと思います(したがって、括弧))。
そして、GetBoxesメソッドを移植するための最良のアプローチは何ですか?もちろん、これはコレクションの保存方法によって異なります。ここでも複数のアプローチを見ることができます:
(std::vector<Box> GetBoxes();)
std::shared_ptr<std::vector<Box>> GetBoxes();
*std::vector<Box> GetBoxes();
std::vector<Box>& GetBoxes();
最初の解決策は正しくないようです。ベクトルは戻ったときにコピーされるため、呼び出し元は元のコレクションを変更できませんでした。
しかし、他の3つのアプローチは私には同じように良いようです。BoxStoreインスタンスは長期間存続し、アプリの実行中に破棄されないため、呼び出し元はコレクションの所有権を持ちません。これは、shared_ptrを返すことが意味的に正しくないことを意味しますか?(コレクションを解放するのは常にBoxStoreオブジェクトです。)
そして、生のポインタと参照を返すことには大きな違いがありますか?