2

私は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オブジェクトです。)

そして、生のポインタと参照を返すことには大きな違いがありますか?

4

1 に答える 1

1

これはあなたが探している可能性のあるものかもしれません。BoxStoreは実際にオブジェクトを所有しています。したがって、ポインタなどは必要ありません。個々のボックスオブジェクトとリストはストアよりも長持ちしないと想定しています。その要件がある場合は、ポインターの使用を検討する必要があるかもしれません。

参照による返品については、カプセル化に違反するため、あまり良いデザインではありません。したがって、クライアントがリストを変更できるようにする制約がない場合は、リストのコピーをoutに提供します。

#include <list>

class Box
{
...
};

class BoxStore
{
private :
    std::list<Box> boxes;

public :
    std::list<Box>& GetBoxes()
    {
        return boxes;
    }
}
于 2012-07-17T13:33:01.283 に答える