“Common::PluginInterface”: 无法实例化抽象类

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_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值