C++ 同一超类的两个类之间的相互更新
我有一个OpenGL应用程序,它有两个主要部分(查看器),主要循环如下: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
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上有许多变体。有一些删除了“控制器”部分,以便更接近您正在做的事情:视图同时进行输入和输出(但仍然将公共数据移动到模型中)。您不能创建一个帮助器类,它同时进行更新,并且当您需要更新时,您可以调用它的对象。在构造函数中,它将使用指向其他两个对象的指针,并以一致的方式进行更新。您可以尝试一种基于事件的方法:将用户交互放入事件中,并将其发送给所有查看器,每个查看器都在筛选它感兴趣的事件。