Реализация шаблона проектирования MVP в STL

Я пытаюсь реализовать шаблон MVP с использованием STL, и я использовал * 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;
    };

Тем не менее, у меня есть один вопрос: как я могу получить shared_ptr из указателя this? Я видел решение, предложенное boost, но искренне думаю, что нет зашел так далеко. Дело в том, что единственный способ установить * weak_ptr * - это shared_ptr, и если мне придется сделать это в классе, который не имеет shared_ptr для самого себя, это будет сложно.

Итак, здесь в основном представление создает модель, но модель должна ссылаться на представление, чтобы реализовать шаблон наблюдателя. Проблема в том, что я застрял, потому что не могу установить указатель представления 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.


person mihaipopescu    schedule 30.08.2011    source источник


Ответы (1)


shared_from_this может помочь: http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/enable_shared_from_this.html

person Mark B    schedule 30.08.2011
comment
Интересно, теперь у меня сбой :) Исключение Microsoft C ++: std :: tr1 :: bad_weak_ptr в ячейке памяти 0x0032f6c4 .. - person mihaipopescu; 01.09.2011
comment
Я обнаружил, что мне нужно создать фабрику - person mihaipopescu; 01.09.2011
comment
Наконец, вот мое решение. Static std :: shared_ptr ‹MyView› MyView :: create () {std :: shared_ptr ‹MyView› myView (новый MyView); std :: shared_ptr ‹MyModel› myModel = std :: make_shared ‹MyModel› (); myView- ›myModel = myModel; myView- ›myPresenter = std :: make_shared ‹MyPresenter› (); myModel- ›myPresenter = myView-› myPresenter; myModel- ›myView = myView; return myView; } - person mihaipopescu; 01.09.2011