7

C ++アプリケーションでGUIを作成していて、GUIObject他のすべてのコンポーネント(たとえばButton、などCheckBox)の基本クラスであるというクラスがあります。Window

作成されたすべてのsGUIObjectsStorageで構成されるクラスもあります。GUIObjectこれまで生のポインターを扱ってきたので、GUIObjectクラス用に次のコンストラクターを用意しました。

GUIObject::GUIObject() :
{
    GUIObjectsStorage::Instance().addObject(this);
}

そして、特定のオブジェクトにアクセスしたいときはいつでも、からそれを取得したので、私のニーズには問題ありませんGUIObjectsStorageでした。しかし今、私はスマートポインターの使用に移行しようとしています。これにより、生のポインターGUIObjectsStorageの代わりに配列が格納std::shared_ptr<GUIObject>され、以前使用していたコンストラクターを使用できなくなります。

GUIObject::GUIObject() :
{
    GUIObjectsStorage::Instance().addObject(std::shared_ptr<GUIObject>(this));
}

たとえば:

// Somewhere in code
std::shared_ptr<Button> bt = std::shared_ptr<Button>(new Button());

基本的に、2つshared_ptrのs(ここでは1つ、コンストラクターGUIObjectsStorageで追加されたため、2番目Button)があり、どちらも参照カウント= 1ですが、どちらもメモリ内の同じオブジェクトを指しています。その後、そのうちの1つが死ぬと、オブジェクト自体も破壊されます。

GUIObjectそこで、継承するすべてのクラスのプライベートコンストラクターを作成し、静的メソッドを作成して返すというアイデアを思いつきました。このメソッドはstd::shared_ptr、にコピーして追加しGUIObjectsStorageます。このようにしてshared_ptr、参照カウント= 2のsを作成できます。これは正しいです:

class Button : public GUIObject 
{
private:
    // ...
    Button();
public:
    // ...
    static std::shared_ptr<Button>  create(); 
}

std::shared_ptr<Button> Button::create()
{
    std::shared_ptr<Button> bt = std::shared_ptr<Button>(new Button());
    GUIObjectsStorage::Instance().addObject(bt);

    return bt;
} 

コンストラクターを非表示にすることで、メソッドを使用する以外の方法でオブジェクトを作成する人がいないことを確認できますcreate()

しかし、これはこれを設計する良い方法ですか?そうでない場合、この問題のより良い解決策は何でしょうか?

4

2 に答える 2

2

これは、オブジェクトを作成するためのファクトリの古典的な使用法です。

そうは言っても、これは必要ないかもしれません。ウィジェットが不要になった時期を知っていますか?このようなGUIマネージャーはよくそうします。もしそうなら、コメンターは正しいです:オブジェクトの所有者を指定し、それを削除させれば、あなたは設定されます。

于 2013-03-24T13:20:06.977 に答える
0

enable_shared_from_thisから継承することを検討できます。

次に、オブジェクトへのshared_ptrを取得したら、 shared_from_this()を使用して、オブジェクトを保持するshared_ptrを取得できます。

于 2013-03-24T09:44:58.183 に答える