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()
。
しかし、これはこれを設計する良い方法ですか?そうでない場合、この問題のより良い解決策は何でしょうか?