我试图在我正在使用的Qt应用程序中实现MVC设计模式,并希望将菜单栏放在从QMenuBar派生的自己的类中(我称之为菜单)而窗口本身是另一个派生自QMainWindow的类(我称之为MainWindow)。为了将菜单栏附加到主窗口,我需要将指向MainWindow的指针传递给Menu类。不幸的是,这使Menu依赖于MainWindow,我想避免使用它。
我有点像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/
以下是我发现最有帮助的建议:
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.
答案 0 :(得分:2)
只有在以下情况下才需要直接包含在标题中:类的成员不是指针(不要用非繁琐的类做)或者如果你必须子类包含的类。
在所有其他情况下使用前向声明。它不是一个“大师特色”,它是解决不必要依赖的标准方法。
P.S。:如果你提出这样的问题,我建议你阅读一些关于C ++和Qt的介绍文献。我不确定,如果用QcenuBar和QMainWindow这样的Qt类进行子类化,你当前的经验水平是正确的。阅读QtCreator文档。检查QML / QtQuick。