私は STL を使用して MVP パターンを実装しようとしていますが、繰り返し参照するときに「サイクルを壊す」ために *shared_ptr* と *weak_ptr* を使用しました。
class i_model;
class i_view;
class i_view
{
public:
i_view() : myModel(NULL) {}
virtual ~i_view() {}
void set_model(const std::shared_ptr<i_model>& _model) { myModel = _model; }
virtual void fire_keyboard(unsigned char key, int x, int y) {}
virtual void on_model_changed() { };
virtual void render() const = 0;
protected:
std::shared_ptr<i_model> myModel;
};
class i_model
{
public:
i_model() : myView() {}
virtual ~i_model() {}
void set_view(const std::shared_ptr<i_view>& _view) { myView = _view; }
void fire_model_changed() { std::tr1::shared_ptr<i_view> p = myView.lock(); p->on_model_changed(); }
protected:
std::weak_ptr<i_view> myView;
};
まだ 1 つの質問があります: thisポインターから shared_ptr を取得するにはどうすればよいですか? ブーストによって提案されたソリューションを見ましたが、それほど遠くないと心から思います。問題は、*weak_ptr* を設定する唯一の方法は、shared_ptr から行うことであり、それ自体に shared_ptr を持たないクラス内でこれを行う必要がある場合、それは困難になるということです。
したがって、ここでは基本的にビューがモデルを作成しますが、モデルはビューを参照して Observer パターンを実装する必要があります。問題は、モデルのweak_ptrビューポインターを設定できないため、行き詰まっていることです。
...
void MyView::Create()
{
std::shared_ptr<MyModel> model = std::make_shared<MyModel>();
i_view::set_model(model);
model->set_view(this); // error C2664: cannot convert parameter 1 from MyModel* to 'std::tr1::shared_ptr<_Ty>'
}
...
他の方法はありますか?:) これは、私がブースト担当者を信用していないと言っているようなものですが、そうではありません。実際、私の質問は、そもそもこの混乱に陥らずに MVP を実装する別の方法があるかどうかということです。
PS: MVP 監視コントローラー パターンを実装しようとしています。コード サンプルでは、i_presenter インターフェイスを除外しました。コンパイル エラーはさらに上にあります。パッシブ ビュー アプローチを試したとしても、同じでした。詳細については、ここでModel-View-Presenter Pattern を参照してください。