在MVC设计中避免与c++的循环依赖

Avoiding circular dependancy with C++ in MVC design

本文关键字:c++ 循环 依赖 MVC      更新时间:2023-10-16

我试图实现MVC设计模式在Qt应用程序我正在工作,并想把菜单栏在自己的类派生自QMenuBar(我称之为菜单),而窗口本身是从QMainWindow派生的另一个类(我称之为MainWindow)。为了将菜单栏附加到主窗口,我需要将指向MainWindow的指针传递给menu类。不幸的是,这使得菜单依赖于主窗口,这是我想避免的。

我有点c++的菜鸟,甚至更尊重MVC设计所以,有人知道一个优雅的解决方案,这个问题?在谷歌上搜索了一下,发现向前声明可能解决了我的问题,但我想知道是否有更简单的方法。如果需要的话,我可以提供一些示例代码,但问题的本质是我只想将对ClassA的引用传递给ClassB。

ClassA.cpp

ClassA() : ClassC
{
}

ClassB.cpp

ClassB(ClassA *parent) : ClassD
{
    ClassA *my_parent = parent;
}

前向声明是这种事情的优雅解决方案,还是可能有更好的方法?

编辑:

对于其他有类似问题的人来说,前向声明很可能是简单情况下的答案。Disch在cpluplus.com上写的这篇文章对我很有帮助:
http://www.cplusplus.com/forum/articles/10627/
以下是我觉得最有用的建议:

有两种基本的依赖你需要知道:可以提前申报的物品2)需要包含的内容例如,如果类A使用类B,那么类B就是类A的一个依赖关系。是否可以前向声明或者是否需要包括在内取决于B如何在A中使用:-如果:A没有提到B,什么都不做-如果:对B的唯一引用是在友元声明中,什么都不做如果A包含B指针或引用,则forward声明B:如果一个或多个函数有B对象/指针/引用,则forward声明BB MyFunction(B myb);如果:B是a的父类,则包含"b.h"- #include "b.h"如果:A包含一个B对象:B myb;你想要做最不激烈的选择。如果可以的话什么都不要做,但是如果如果可以,请提前申报。但如果有必要,那么#include其他的头。

直接包含在头文件中只有在:类的成员不是指针(不要对不重要的类这样做)或者必须创建包含的类的子类时才需要。

在所有其他情况下使用前向声明。这不是一个"大师特性",它是解决不必要依赖的标准方法。

注:如果你问这样的问题,我建议阅读一些关于c++和Qt的入门文献,我不确定,如果子类化Qt类如QMenuBar和QMainWindow以你目前的经验水平是正确的方式。阅读QtCreator文档。检查QML/QtQuick。