1

对不起,奇怪的标题,如果您能想到一个,请随时提出一个更好的标题。

这是我的问题。

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

QObject -> MyBase -> MyDerived

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

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

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

另外,当您分配失败的对象时,有人知道标准行为吗?您应该总是在 try-block 中执行此操作,还是将其包装在某些东西中以检查它是否为空?我阅读了 Qt 文档,他们说如果分配失败,他们的大多数类都会返回空值。该陈述何时为真,如果我不想使用 try-catch,我该怎么办?

4

2 回答 2

7

你应该使用普通指针。这就是 Qt 文档中关于使用 QPoiner 的内容

“受保护的指针将自动转换为 T *,因此您可以自由混合受保护和未保护的指针。这意味着如果您有 QPointer<QWidget>,则可以将其传递给需要 QWidget * 的函数。因此, 声明函数以 QPointer 作为参数是没有什么价值的; *只需使用普通指针*. 当您随时间存储指针时使用 QPointer。”

于 2012-03-16T03:55:45.503 回答
0

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

于 2012-03-17T09:11:15.307 回答