我有以下接口
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 类的析构函数行。
注意
图像发生变化,当我从类定义中删除QObject类SettingsApplierPlugin和Q_OBJECT宏时,一切正常,调试器正确进入函数。
注1
class SettingsApplierPlugin来自一个共享库,而来自class Core另一个共享库。
笔记2
所有string_ts 都是 typedef -> using string_t = QString。
我的限制
我想从中派生,QObject因为我想使用提供的signal-slot机制。
问题
任何人都可以解释这种行为并提出解决此问题的方法吗?