0

here で説明されているように、MVP Passive View で FLTK を使用しようとすると、非常に基本的な問題があります。なんとかやり遂げましたが、自分のやり方が正しいとは思えません。

Fl_Windowいくつかのウィジェットと OpenGL 機能用の が含まれFl_Gl_Windowています。ご存知のように、ウィジェットなどを と のFl_Windowbegin()に追加できます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通信する必要があり、は への参照を保持する必要があり、その逆も同様です。そのため、インターフェイス ヘッダーで前方宣言を使用しました。PresenterFowlerViewPresenter

すでに述べたように、これを行うためのより良い方法があるかどうかを知りたいです。Fl_Gl_Windowおそらく、この時点でインスタンス化せずに を追加することは何とか可能です。あるいは、私のMVP Passive Viewアプローチが間違っているのかもしれません。

私の説明が理解できることを願っています。よろしくお願いします。

4

0 に答える 0