Я пытаюсь реализовать шаблон 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, это будет сложно.
Так чтоздесь в основном представление создает модель, но модель должна ссылаться обратно на представление для реализации шаблона 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 Supervising Controller.В примере кода я исключил интерфейс i_presenter, ошибка компиляции еще больше.Было бы то же самое, если бы я попробовал подход пассивного просмотра.Вы можете прочитать больше о них здесь Модель-Представление-Представляющий Образец .