我有一组相当复杂的C++类,这些类是从Java重写的。每个类都有一个单独的继承类,并实现了一个或多个抽象类(或接口)。
是否可以使用qobject_cast()
将类转换为其中一个接口?如果我将所有接口派生自QObject
,由于不明确的QObject
引用,我会得到一个错误。然而,如果我只有基类继承自QObject
,我就无法使用qobject_cast()
,因为它只能用于QObject
。
我希望能够通过其接口在插件和DLL之间传递类对象。
我有一组相当复杂的C++类,这些类是从Java重写的。每个类都有一个单独的继承类,并实现了一个或多个抽象类(或接口)。
是否可以使用qobject_cast()
将类转换为其中一个接口?如果我将所有接口派生自QObject
,由于不明确的QObject
引用,我会得到一个错误。然而,如果我只有基类继承自QObject
,我就无法使用qobject_cast()
,因为它只能用于QObject
。
我希望能够通过其接口在插件和DLL之间传递类对象。
qobject_cast()也可以与接口一起使用;有关详细信息,请参见Plug&Paint示例。
这是示例的链接:Plug&Paint。
在示例中挖掘接口头文件后,我发现了Q_DECLARE_INTERFACE宏,可以让您实现所需功能。
首先,请不要从接口中继承QObject
。对于每个接口,请使用以下方式进行Q_DECLARE_INTERFACE声明:
class YourInterface
{
public:
virtual void someAbstractMethod() = 0;
};
Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0")
然后在你的类定义中,使用Q_INTERFACES宏,像这样:
class YourClass: public QObject, public YourInterface, public OtherInterface
{
Q_OBJECT
Q_INTERFACES(YourInterface OtherInterface)
public:
YourClass();
//...
};
经过所有的麻烦后,以下代码可以正常工作:
YourClass *c = new YourClass();
YourInterface *i = qobject_cast<YourInterface*>(c);
if (i != NULL)
{
// Yes, c inherits YourInterface
}
if (YourInterface *i = qobject_cast<YourInterface*>(c)) { }
。这可以确保指针在无效时不被使用。 - Puppy=
不是一个好的做法,因为很多人会将其与==
混淆。 - Venemo