Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 同一超类的两个类之间的相互更新_C++_Design Patterns_Circular Dependency - Fatal编程技术网

C++ 同一超类的两个类之间的相互更新

C++ 同一超类的两个类之间的相互更新,c++,design-patterns,circular-dependency,C++,Design Patterns,Circular Dependency,我有一个OpenGL应用程序,它有两个主要部分(查看器),主要循环如下: int main(int argc, char* argv[]) { gp::viewers::PatternViewer pViewer; gp::viewers::MeshViewer mViewer; while (!pViewer.shouldClose() && !mViewer.shouldClose()) { pViewer.makeCurre

我有一个OpenGL应用程序,它有两个主要部分(查看器),主要循环如下:

int main(int argc, char* argv[])
{
    gp::viewers::PatternViewer pViewer;
    gp::viewers::MeshViewer mViewer;

    while (!pViewer.shouldClose() && !mViewer.shouldClose())
    {
        pViewer.makeCurrent();
        pViewer.mainLoop();
        pViewer.swap();

        mViewer.makeCurrent();
        mViewer.mainLoop();
        mViewer.swap();

        glfwWaitEvents();
    }

    glfwTerminate();

    return 0;

}
int main(int argc, char* argv[])
{
    gp::viewers::PatternViewer pViewer;
    gp::viewers::MeshViewer mViewer;

    while (!pViewer.shouldClose() && !mViewer.shouldClose())
    {
        pViewer.makeCurrent();
        pViewer.mainLoop();
        pViewer.swap();

        mViewer.makeCurrent();
        mViewer.mainLoop();
        mViewer.swap();

        // UPDATE HERE
        mViewer.update(pViewer);
        pViewer.update(mViewer);

        glfwWaitEvents();
    }

    glfwTerminate();

    return 0;

}
用户与一个查看器的交互会将更改传播到另一个查看器。我的直觉告诉我如下更新循环:

int main(int argc, char* argv[])
{
    gp::viewers::PatternViewer pViewer;
    gp::viewers::MeshViewer mViewer;

    while (!pViewer.shouldClose() && !mViewer.shouldClose())
    {
        pViewer.makeCurrent();
        pViewer.mainLoop();
        pViewer.swap();

        mViewer.makeCurrent();
        mViewer.mainLoop();
        mViewer.swap();

        glfwWaitEvents();
    }

    glfwTerminate();

    return 0;

}
int main(int argc, char* argv[])
{
    gp::viewers::PatternViewer pViewer;
    gp::viewers::MeshViewer mViewer;

    while (!pViewer.shouldClose() && !mViewer.shouldClose())
    {
        pViewer.makeCurrent();
        pViewer.mainLoop();
        pViewer.swap();

        mViewer.makeCurrent();
        mViewer.mainLoop();
        mViewer.swap();

        // UPDATE HERE
        mViewer.update(pViewer);
        pViewer.update(mViewer);

        glfwWaitEvents();
    }

    glfwTerminate();

    return 0;

}
但在这种情况下,PatternViewer需要了解MeshViewer,而MeshViewer需要了解PatternViewer——一种循环依赖关系。此外,还不清楚mViewer.update(pViewer)是否应该使用mViewer提供的任何更新来更新pViewer,反之亦然。在我看来,它应该是以前的-mViewer应该知道要传播哪些更新,而不是pViewer

应该提到的是,PatternViewer和MeshViewer都继承自抽象超类查看器


有没有办法解决这个循环依赖关系?是否有一种可接受的方式/设计模式来处理这种情况?

查看器(即基类)中,查看器之间共享的信息是否可见?如果是这样,那么抽象
查看器
需要知道如何从另一个抽象
查看器
更新,但不需要每个具体
查看器
,例如
模式查看器
网格查看器
了解另一个具体
查看器
——换句话说,不需要循环依赖关系。

这种情况下的标准模式是MVC(模型、视图、控制器)

使用这种模式,两个观看者都不知道另一个。视图之间共享的数据位于模型中。当查看器需要更新某些内容时,它会更新模型(尽管如果您真的遵循MVC,视图应该只显示输出,而输入应该来自控制器)

与原始数据一起,模型保留数据上所有当前视图的列表。当模型更新时,它会将更改传播到所有视图


请注意,MVC上有许多变体。有一些删除了“控制器”部分,以便更接近您正在做的事情:视图同时进行输入和输出(但仍然将公共数据移动到模型中)。

您不能创建一个帮助器类,它同时进行更新,并且当您需要更新时,您可以调用它的对象。在构造函数中,它将使用指向其他两个对象的指针,并以一致的方式进行更新。您可以尝试一种基于事件的方法:将用户交互放入事件中,并将其发送给所有查看器,每个查看器都在筛选它感兴趣的事件。