包含派生对象的QPointer和基类不匹配

QPointer containing derived object wont match one with the baseclass

本文关键字:基类 不匹配 QPointer 派生 对象 包含      更新时间:2023-10-16

对于wierd标题感到抱歉,如果你能想到一个更好的,请随时提出。

这是我的问题。

我有一个看起来像这样的结构:

QObject->MyBase->MyDerived

然后我有一个函数,它将把任何派生类型作为QPointer;

void function(QPointer<MyBase> base) {
   ...
}

现在的问题是,我不能将QPointer<MyDerived>传递到这个函数中,如果我使用标准指针,我会这样做。我必须强制转换这个对象以使其适合函数吗?还是应该只使用普通指针?

另外,当你分配一个失败的对象时,有人知道标准行为吗?你应该总是在try块中这样做,还是用一些东西包装它来检查它是否为null?我阅读了Qt文档,他们说如果分配失败,他们的大多数类都会返回null值。这个说法什么时候成立?如果我不想使用try-catch,我该怎么办?

您应该使用普通指针。这就是Qt文档关于使用QPoiner 的说明

"保护指针将自动转换为T*,因此您可以自由混合保护指针和非保护指针。这意味着,如果您有一个QPointer<QWidget>,您可以将其传递给需要QWidget*的函数。因此,声明函数将QPointer作为参数没有什么价值;*只使用普通指针*随着时间的推移,按一下指针。"

正如@Kunal所提到的,在您的情况下最好传递原始指针,但我看到您遇到了指针所有权问题。将原始指针传递到对象的方法是危险的,因为当代码库增长时,您很快就会混淆哪个对象是该特定指针的所有者,这很容易导致内存泄漏。出于这个原因,我建议使用QSharedPointer,而不是QPointer,甚至是原始指针。QSharedPointer支持多态性,因此您可以将其(作为值)传递给您想要的任何函数/对象,而无需担心所有权,因为QSharedPPointer将获得指针的所有权,并在QSharedPpointer的所有最后一个实例超出范围时将其删除。