here で説明されているように、MVP Passive View で FLTK を使用しようとすると、非常に基本的な問題があります。なんとかやり遂げましたが、自分のやり方が正しいとは思えません。
Fl_Window
いくつかのウィジェットと OpenGL 機能用の が含まれFl_Gl_Window
ています。ご存知のように、ウィジェットなどを と の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
アプローチが間違っているのかもしれません。
私の説明が理解できることを願っています。よろしくお願いします。