我有一个非常基本的问题,尝试使用FLTK和MVP Passive View,如here所述。我设法做到了,但我觉得这样做不对。
我有一个Fl_Window
,包含一些Widgets和一个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
,所以两个Windows都是视图(一个View
包含另一个)。每个View
都需要与Presenter
进行通信,并且如序列图中Fowler
所示,View
需要保留对Presenter
和Fl_Gl_Window
的引用反之亦然。所以我在接口头文件中使用了forward声明。
如前所述,我想知道,如果有更好的方法可以做到这一点。也许在某种程度上可以添加MVP Passive View
而不必在此时实例化它。或者我的{{1}}方法可能不正确。
我希望我的解释是可以理解的。 在此先感谢您的帮助!