实现接口时未满足断点

时间:2019-07-22 19:32:18

标签: c++ qt qobject

我有以下界面

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)(此处的插件是类SettingsApplierPlugin的实例)时,调试器将显示该类的声明的行,并再执行一步,则显示该行插件类的析构函数。

通知

当我从QObject的基类中删除SettingsApplierPlugin类并从类定义中删除Q_OBJECT宏时,图像发生了变化,一切正常,调试器正确地进入了函数。 / p>

注释1

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

注释2

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

我的限制

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

问题

有人可以解释这种行为并提出解决方案吗?

0 个答案:

没有答案