gpt4 book ai didi

c++ - QSharedPointer,如何传递它们,我需要它们吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:47 27 4
gpt4 key购买 nike

这几天一直在尝试理解共享指针,但感觉我似乎无法理解。不确定是不是太明显了还是太复杂了。首先,谁能给我一个实际使用共享指针的例子。维基百科上的例子对我来说毫无意义。以及如何将共享指针传递给另一个函数或创建具有共享指针的对象。那么,您如何传递它以及您将在哪里使用它?任何信息或示例都会很棒。

另外,我有这个问题,我不知道该用什么。我有这个功能,我分配一个 QFile并将其传递给另一个类中的函数。该函数将文件作为 QIODevice*然后创建一个包含该文件的对象。我想知道这里最好的解决方案是什么以及如何(如果我应该)在这里使用共享指针?如何使用 <QFile> 创建共享指针并将其传递到函数采用 <QIODevice> 的位置.感觉我根本没有得到共享指针......

我的另一种方法是将 QFile 的分配在QScopedPointer .然后我将它传递给类,在创建将存储文件的对象时,我使用 QPointerQScopedPointer .在第一个调用函数的末尾,我应该调用 take() 对吗?

function () {
QScopedPointer<QFile> item(new QFile("filename"));
SomeClassObject->doStuff(item.data());
item.take();
}
---------------------------------
SomeClass::doStuff(QIODevice *item) {
_currentObject = new MyObject(item); // should _currentObject be a smartpointer?
...
}
---------------------------------
class MyObject {
QPointer<QIODevice> _item;

...
MyObject(QIODevice *item) { _item = item; }
}

所以我想要一种存储指针的方法,以及一种在“new”抛出异常时在创建过程中处理它们的方法。

最佳答案

共享指针(以及其他类似的指针包装器)的要点是正确处理指向对象的指针的销毁。也就是说,不必手动确保删除最后一个拷贝(并且只删除最后一个拷贝),共享指针会在它超出范围时为您处理。共享部分意味着您可以创建此包装器对象(共享指针对象)的拷贝,并且它将在拷贝之间“共享”指向对象的指针(就像您制作了常规指针的拷贝一样)具有额外的好处如上所述。

至于你的代码,SomeClass::doStuff()应该有一个 QScopedPointer<QFile>传递参数(而不是 QIODevice* 一个)item它具有那种类型。

MyObject相同的构造函数:让它接受一个参数 QPointer<QIODevice>QSharedPointer<QIODevice>类型。一般来说,凡是要使用指针的地方,都使用QSharedPointer。相反(使用适当的模板类型)。这将使您免于以后访问已删除对象的麻烦。

当然,有时您实际上需要原始的 QIODevice指针(例如第三方库调用),那么您将使用 data()共享指针对象的成员函数。只要确保您不保留(即存储或以其他方式复制超出必要的内容)返回的原始指针,因为这会削弱共享指针的目的——共享指针将不知道您不在的额外原始指针共享指针对象的管理。

编辑: take()从作用域指针释放指向对象的所有权,因此当作用域指针被销毁时,它不会删除该对象。在您将所有权转让给其他东西的情况下,您不会使用它——就像您的情况一样 MyObject .

关于c++ - QSharedPointer,如何传递它们,我需要它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9833173/

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