1

我有以下接口

template <typename string_t>
class PluginManager
{
public:
  virtual ~PluginManager() = default;
  virtual Plugin<string_t>* findPlugin(string_t const&plugin_uuid) const = 0;
  virtual Plugin<string_t>* loadPlugin(string_t const&plugin) = 0;
  virtual void unloadPlugin(string_t const&plugin) = 0;
  virtual void registerPlugin(Plugin<string_t> *plugin) = 0;
  virtual void unregisterPlugin(Plugin<string_t> *plugin) = 0;
  virtual void sigPluginLoaded() = 0;
};

template <typename string_t>
class Plugin
{
public:
  virtual ~Plugin() = default;
  virtual string_t uuid() const = 0;
  virtual void setManager(PluginManager<string_t> *manager) = 0;
};

我还有两个实现这些接口的类

class Core : public QObject, public PluginManager<QString>
{
  Q_OBJECT
  using string_t = QString;
  using map_t = QMap<string_t, ad::Plugin<string_t>*>;
private:
  Core();
public:
  static Core* instance();
  Plugin<string_t>* findPlugin(string_t const&plugin_uuid) const override;
  Plugin<string_t>* loadPlugin(string_t const&plugin) override;
  void unloadPlugin(string_t const&plugin) override;
  void registerPlugin(Plugin<string_t> *plugin) override;
  void unregisterPlugin(Plugin<string_t> *plugin) override;
signals:
  void sigPluginLoaded();
private:
  map_t __plugin_map;
  static Core* __instance;
};

class SettingsApplierPlugin : public QObject, public ad::Plugin<QString>
{
  Q_OBJECT
public:
  SettingsApplierPlugin();
  QString uuid() const override;
  void setManager(ad::PluginManager<QString> *manager) override;
public slots:
  void updateSettings() const;
private:
  PluginManager<QString> *__plg_mgr;
};

最后是这个问题所需的功能实现

void Core::registerPlugin(ad::Plugin<Core::string_t> *plugin)
{
  plugin->setManager(this);
  __plugin_map.insert(plugin->uuid(), plugin);
  emit sigPluginLoaded();
}

问题

当我调试代码时(我将 VSCode 与 gdb 8.2.91 和 Ubuntu 19.04 一起使用),它的行为很奇怪。当我进入plugin->setManager(this)(此时的插件是 class 的一个实例SettingsApplierPlugin)时,调试器会显示该类的声明行,再一步进入后,它会显示 Plugin 类的析构函数行。

注意

图像发生变化,当我从类定义中删除QObjectSettingsApplierPluginQ_OBJECT宏时,一切正常,调试器正确进入函数。

注1

class SettingsApplierPlugin来自一个共享库,而来自class Core另一个共享库。

笔记2

所有string_ts 都是 typedef -> using string_t = QString

我的限制

我想从中派生,QObject因为我想使用提供的signal-slot机制。

问题

任何人都可以解释这种行为并提出解决此问题的方法吗?

4

0 回答 0