gpt4 book ai didi

c++ - 尝试将 qobject_cast 用于 Const 指针时的编译问题

转载 作者:行者123 更新时间:2023-11-28 04:18:11 28 4
gpt4 key购买 nike

我在 Qt 中实现低级插件,但偶然发现了一个奇怪的编译错误。

当我尝试使用 qobject_cast 将插件实例转换为 const 接口(interface)指针时,它告诉我接口(interface)本身应该继承 QObject 并使用 Q_OBJECT 宏。

但是,当我使用 qobject_cast 转换为非常量接口(interface)指针时,它编译得很好。

我有一个界面:

class PluginInterface
{

public:
PluginInterface(const QString &string);
virtual void doSomething() const = 0;

protected:
QString string;
};

Q_DECLARE_INTERFACE(PluginInterface, "PluginInterface")

和一个实现:

class PLUGINSHARED_EXPORT Plugin : public QObject, public PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
Q_PLUGIN_METADATA(IID "Plugin")

public:
Plugin();

void doSomething() const;
};

当尝试使用 qobject_cast 转换为 const 指针进行编译时,它会提示 PluginInterface 应该继承自 QObject 并使用 Q_OBJECT 宏。

    QPluginLoader loader("C:/Users/Henrique/Documents/Qt Projects/PluginTest/Plugin.dll");

const PluginInterface *interface = qobject_cast<const PluginInterface *>(loader.instance());

interface->doSomething();

然而,这编译得很好,也就是说,转换为一个非常量 PluginInterface 指针。

    QPluginLoader loader("C:/Users/Henrique/Documents/Qt Projects/PluginTest/Plugin.dll");

const PluginInterface *interface = qobject_cast<PluginInterface *>(loader.instance());

interface->doSomething();

为什么会这样?

最佳答案

我认为这是因为宏 Q_DECLARE_INTERFACE不实现此功能。

Q_DECLARE_INTERFACE定义:

#  define Q_DECLARE_INTERFACE(IFace, IId) \
template <> inline const char *qobject_interface_iid<IFace *>() \
{ return IId; } \
template <> inline IFace *qobject_cast<IFace *>(QObject *object) \
{ return reinterpret_cast<IFace *>((object ? object->qt_metacast(IId) : nullptr)); } \
template <> inline IFace *qobject_cast<IFace *>(const QObject *object) \
{ return reinterpret_cast<IFace *>((object ? const_cast<QObject *>(object)->qt_metacast(IId) : nullptr)); }
#endif // Q_MOC_RUN

正如我们所见,这个宏只包含这些qobject_cast功能:template <> inline IFace *qobject_cast<IFace *>(QObject *object)template <> inline IFace *qobject_cast<IFace *>(const QObject *object) .

关于c++ - 尝试将 qobject_cast 用于 Const 指针时的编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56094313/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com