我已经声明了一个类
B
,以及一个后代类D
。 我也有一个方法:
myMethod(QPointer<B> param1) {}
当我尝试使用
myMethod()
到 QPointer
作为参数调用 D
时,编译器会抱怨:
无法将 'QPointer
' 转换为 'QPointer'
为什么抱怨? 我认为传递
QPointer<D>
会隐式地将其向上转换为 QPointer<B>
? 我该如何解决这个问题?
QPointer<T>
是一个受保护的指针,其中 T
must 源自 QObject
(参见 here)。这里的“受保护”只是意味着它可以是 nullptr 或指向合法的 QObject,即尚未销毁的对象,不涉及引用计数,使用框架状态。
从 Qt 6.6 开始,定义了有助于强制转换的构造函数
template <typename X, QPointer<T>::if_convertible<X> = true>
QPointer::QPointer(QPointer<X> &&other)
template <typename X, QPointer<T>::if_convertible<X> = true>
QPointer::QPointer(const QPointer<X> &other)
如果没有发生这种情况,则意味着您的
X
无法转换为 T
,例如不相关或者您以某种方式使用了多重继承等。
在大多数情况下,定义为
QPointer<B> param1
的参数对于转换和复制指针包装器来说是无用的浪费时间,对于单线程,可以废除它并可以使用内部 qobject_cast
或 Qt 测试宏。无法真正保证对象不会被销毁,并且会就地创建相同类型的new对象,据我所知,它只能保证指针包含正确的值。对于多线程使用有时,您可能需要一个引用计数拥有指针QSharedPointer
。