在MVC设计中避免使用C ++进行循环依赖

时间:2014-07-13 22:04:47

标签: c++ qt

我试图在我正在使用的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.

1 个答案:

答案 0 :(得分:2)

只有在以下情况下才需要直接包含在标题中:类的成员不是指针(不要用非繁琐的类做)或者如果你必须子类包含的类

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

P.S。:如果你提出这样的问题,我建议你阅读一些关于C ++和Qt的介绍文献。我不确定,如果用QcenuBar和QMainWindow这样的Qt类进行子类化,你当前的经验水平是正确的。阅读QtCreator文档。检查QML / QtQuick。