C++ 避免与C+的循环依赖+;在MVC设计中的应用

C++ 避免与C+的循环依赖+;在MVC设计中的应用,c++,qt,C++,Qt,我试图在我正在开发的一个Qt应用程序中实现MVC设计模式,并希望将菜单栏放在它自己的类中,该类派生自QMenuBar(我称之为menu),而窗口本身是另一个派生自QMainWindow的类(我称之为MainWindow)。为了将菜单栏附加到主窗口,我需要将指向主窗口的指针传递到菜单类。不幸的是,这使得菜单依赖于主窗口,这是我想要避免的 我有点是C++ NoOB,MVC设计更是如此,有人知道这个问题的高雅解决方案吗?通过谷歌搜索发现,转发声明可能会解决我的问题,但我想知道是否有更简单的方法。如果需

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

<>我有点是C++ NoOB,MVC设计更是如此,有人知道这个问题的高雅解决方案吗?通过谷歌搜索发现,转发声明可能会解决我的问题,但我想知道是否有更简单的方法。如果需要,我可以提供一些示例代码,但问题的本质是我只想将对ClassA的引用传递给ClassB

ClassA.cpp

ClassA() : ClassC
{
}
类别b.cpp

ClassB(ClassA *parent) : ClassD
{
    ClassA *my_parent = parent;
}
前瞻性声明是解决这类问题的优雅方法,还是有更好的方法

编辑:

对于其他任何有类似问题的人,转发声明很可能是简单案例的答案。Disch在cpluplus.com上的这篇文章对我很有帮助:

以下是我认为最有帮助的建议:

您需要注意两种基本的依赖关系: 1) 可以向前声明的内容 2) 需要包括在内的东西 例如,如果类A使用类B,那么类B就是类A的一个 依赖关系。是否可以向前声明或需要包含 取决于B在A中的使用方式: -如果:A根本没有提及B,则不执行任何操作 -如果:对B的唯一引用是在朋友声明中,则不执行任何操作 -如果:A包含B指针或引用:B*myb,则向前声明B; -正向声明B if:一个或多个函数具有B对象/指针/引用 作为参数,或作为返回类型:B MyFunction(B myb); -#如果:b是a的父类,则包括“b.h” -#如果:A包含b对象:b myb,则包含“b.h”; 你想做尽可能不激烈的选择。如果可以,什么也不做,但是如果 你不能,如果可以的话,向前申报。但如果有必要,则包括 其他标题。
仅当类的成员不是指针时(不要使用非平凡类),或者必须对包含的类进行子类化时,才需要直接包含在标题中

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

如果你问这样的问题,我建议阅读一些关于C++和QT的介绍性文献。我不确定,根据您当前的经验水平对QMenuBar和QMainWindow等Qt类进行子分类是否正确。阅读QtCreator文档。检查QML/QTQuo.< /P>“这不是Guru特性”是我需要听到的:)我认为这个技巧在我读过C++的两本书之间有所不同。我接受了你的建议,找到了一篇文章,我认为这篇文章很好地填补了这个空白。非常感谢。 There are two basic kinds of dependencies you need to be aware of: 1) stuff that can be forward declared 2) stuff that needs to be #included If, for example, class A uses class B, then class B is one of class A's dependencies. Whether it can be forward declared or needs to be included depends on how B is used within A: - do nothing if: A makes no references at all to B - do nothing if: The only reference to B is in a friend declaration - forward declare B if: A contains a B pointer or reference: B* myb; - forward declare B if: one or more functions has a B object/pointer/reference as a parementer, or as a return type: B MyFunction(B myb); - #include "b.h" if: B is a parent class of A - #include "b.h" if: A contains a B object: B myb; You want to do the least drastic option possible. Do nothing if you can, but if you can't, forward declare if you can. But if it's necessary, then #include the other header.