У меня есть очень простая проблема, пытаясь использовать FLTK с MVP Passive View, как описано Вот. Мне удалось это сделать, но я чувствую себя не так, как я.
У меня есть Fl_Window
, содержащий некоторые виджеты и Fl_Gl_Window
для функциональности OpenGL.
Как вы знаете, вы можете добавлять виджеты и прочее в Fl_Window
между begin()
а также end()
, И кажется, что вам нужно создавать все экземпляры, когда вы добавляете это непосредственно между этими вызовами, так что я получил что-то вроде этого:
(пожалуйста, посмотрите на небольшую «историю» в комментариях рядом с кодом, потому что она объясняет, что я делаю, и я хочу знать, хорошо ли это в этом случае, или, возможно, кто-то может указать мне путь к лучшему решению, потому что это действительно неправильно.)
main.cpp
int main(/*arguments*/) {
Model* model = new Model();
IPresenter* presenter = new Presenter(model); //Presenter only knows the model at this point
IView* view = new View(presenter); //View gets reference to the presenter...
}
view.h
class View : public Fl_Window {
public:
View(IPresenter* presenter);
virtual ~View();
private:
IView* gl_window;
IPresenter* presenter;
};
view.cpp
View::View(IPresenter* presenter) :Fl_Window(/*arguments*/) {
this->presenter = presenter;
begin();
//add some Widgets
gl_window = new GlWindow(this->presenter,/*more arguments*/); //...instantiates GlWindow and passes the received reference to it...
end();
show();
Fl::run();
}
GlWindow.h
GlWindow::GlWindow(IPresenter* presenter, /* more arguments*/) :
Fl_Gl_Window(/*arguments*/), IView() {
//initialisations
this->presenter = presenter; //...which GlWindow uses for communication and...
this->presenter->setView(this); //...to set itself as reference to the presenter
//same with View
}
IPresenter.h
class IView; //forward declaration because IPresenter includes IView and vice versa
class IPresenter {
public:
//pure virtual methods
};
IView.h выглядит так же, как IPresenter.h.
Потому что я хочу сделать MVP
, оба окна являются представлениями (один View
содержащий другое). каждый View
необходимо общаться с Presenter
и как показано на диаграмме последовательности Fowler
, View
должен содержать ссылку на Presenter
и наоборот. Поэтому я использовал предварительное объявление в заголовках интерфейса.
Как уже упоминалось, я хочу знать, есть ли лучший способ сделать это. Может быть, как-то можно добавить Fl_Gl_Window
без необходимости создавать его на этом этапе. Или, может быть, мой MVP Passive View
подход неверен.
Я надеюсь, что мое объяснение понятно.
Заранее спасибо за помощь!
Задача ещё не решена.