1

私は 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 を参照してください。

4

1 に答える 1

2

shared_from_this役立つかもしれません: http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/enable_shared_from_this.html

于 2011-08-30T23:27:24.833 に答える