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