2

这是 C++。我有一个主要课程:

#include <QObject>

#include "Logger.h"
#include "PluginManager.h"

class Main : QObject
{
  Main();
  ~Main();
  Logger &getLogger();

signals:
  // Some signals

public slots:
  // Some slots
};

现在我有了 PluginManager 类。

构造函数是:

PluginManager( QObject *parent = 0 );

我在主类中构造它,如下所示:

pluginManager = new PluginManager(this);

现在,问题是:服务器类需要创建 PluginManager(很明显),并且 PluginManager 必须从服务器类所有插件中获取记录器!

parent()->getLogger(); // This doesn't work (PluginManager)

错误:“类 QObject”没有名为“getLogger”的成员

我是否要创建一个类并从所有类派生它?请举出任何可能有帮助的例子。

提前致谢。

4

3 回答 3

1

面对编译时依赖,有两种方法:

  1. 转发声明您需要的类。
  2. 使用接口打破循环依赖。

前向声明

在您的PluginManager.h文件中,您只需编写

class Main;

在您文件的顶部,以便转发声明Main。然后你声明PluginManageras的构造函数

PluginManager( Main * parent );

在您的实现文件中,PluginManager您需要包含定义Main类的标头。

接口

第二个选项使用一个接口来避免循环依赖。它是这样工作的:

class MainInterface : public QObject
{
    Q_OBJECT
public:
    MainInterface( QObject * parent ) : QObject(parent) {}
    virtual ~MainInterface() {}
    virtual void someFunc1() = 0;
    virtual void someFunc2() = 0;
    // ...
};

class PluginManager : public QObject
{
    Q_OBJECT
public:
    PluginManager( MainInterface * parent = 0 ) 
        : QObject(parent) { /* ... */ }
    // ... other functions ...
};

class Main : public MainInterface
{
public:
    Main( QObject * parent = 0 )
        : MainInterface(parent) {}
    virtual void someFunc1();
    virtual void someFunc2();
    // ...
};

依赖关系图现在看起来像这样

MainInterface                          PluginManager
  A       A              instead of        A  |
  |       |                                |  V
Main   PluginManager                       Main

你的选择

您想使用什么替代方案是您的选择。如果这两个类作为程序的不可分割部分一起工作,则使用更简单的前向声明方法。如果您想将这些组件解耦并尽可能避免依赖关系,则使用第二种方法。

于 2013-07-15T09:18:31.320 回答
0

就错误“'class QObject' has no member named 'getLogger'”而言,它与循环依赖无关。

PluginManager( QObject *parent = 0 )

parent 的类型是 QObject *,它没有成员 getLogger(),它是 Main 类的成员。

于 2013-07-15T09:43:21.310 回答
0

记录器部分是否在应用程序中不断变化?

如果不是,那么在创建 PluginManager 时,您还应该通过传递一个附加参数来初始化记录器,删除插件管理器对服务器的后续依赖

于 2013-07-15T10:45:44.650 回答