我有以下界面
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>
class SettingsApplierPlugin
来自一个共享库,而class Core
来自另一个共享库。
所有string_t
都是typedef-> using string_t = QString
。
我想从QObject
派生,因为我想使用提供的signal-slot
机制。
有人可以解释这种行为并提出解决方案吗?