“Common::PluginInterface”: 无法实例化抽象类
Qt系列文章目录
文章目录
- Qt系列文章目录
- 前言
- 一、错误原因
- 二、解决方法
前言
“Common::PluginInterface”: 无法实例化抽象类
一、错误原因
抽象类不能实例化:
PluginInterface包含纯虚函数initialize和unload,因此是抽象类,不能直接实例化。
Q_PLUGIN_METADATA宏问题:
Q_PLUGIN_METADATA只能用于具体类(可以实例化的类),而不能用于抽象类。
moc工具会尝试实例化Q_PLUGIN_METADATA中引用的类,这就导致了该错误。
二、解决方法
方法 1:将PluginInterface改为纯接口类
如果PluginInterface只是一个接口类,不需要继承QObject,可以将其改为纯接口类。然后插件实现类同时继承QObject和PluginInterface。
修改后的PluginInterface.h文件
#ifndef PLUGIN_INTERFACE_H
#define PLUGIN_INTERFACE_H
#include
namespace Common {
class PluginInterface {
public:
virtual ~PluginInterface() {}
virtual void initialize() = 0;
virtual void unload() = 0;
};
}
#define PluginInterface_iid “com.example.PluginInterface”
Q_DECLARE_INTERFACE(Common::PluginInterface, PluginInterface_iid)
#endif // PLUGIN_INTERFACE_H
插件实现类示例
以下是一个实现PluginInterface的插件类示例:
#ifndef MYPLUGIN_H
#define MYPLUGIN_H
#include <QObject>
#include "PluginInterface.h"
class MyPlugin : public QObject, public Common::PluginInterface {
Q_OBJECT
Q_PLUGIN_METADATA(IID PluginInterface_iid)
Q_INTERFACES(Common::PluginInterface)
public:
void initialize() override {
// 插件初始化逻辑
}
void unload() override {
// 插件卸载逻辑
}
};
#endif // MYPLUGIN_H
方法 2:使用具体的实现类与Q_PLUGIN_METADATA
如果PluginInterface需要继承QObject,则需要创建一个具体的子类实现PluginInterface,并通过Q_PLUGIN_METADATA声明这个具体类。
修改后的PluginInterface.h
保持PluginInterface继承自QObject:
#ifndef _PLUGIN_INTERFACE_H_
#define _PLUGIN_INTERFACE_H_
#include <QObject>
#include <QtPlugin>
namespace Common {
class PluginInterface : public QObject {
Q_OBJECT
public:
PluginInterface(QObject* parent = nullptr) : QObject(parent) {}
virtual ~PluginInterface() {}
virtual void initialize() = 0;
virtual void unload() = 0;
};
}
#endif // _PLUGIN_INTERFACE_H_