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

C++ QSharedPointer,如何传递它们,我需要它们吗?,c++,qt,pointers,shared-ptr,qsharedpointer,C++,Qt,Pointers,Shared Ptr,Qsharedpointer,几天来,我一直试图理解共享指针,但感觉好像我无法理解它。不确定这是显而易见的还是太复杂了。首先,有谁能给我一个例子,你会实际使用共享指针。维基百科上的例子对我来说毫无意义。以及如何将共享指针传递给另一个函数或使用共享指针创建对象。那么,你如何传递它,在哪里使用它呢?任何信息或例子都很好 另外,我也有这个问题,我不知道该用什么。我有一个函数,我分配一个QFile,并将其传递给另一个类中的函数。该函数将文件作为一个QIODevice*,然后创建一个包含该文件的对象。我想知道这里最好的解决方案是什么,

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

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

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

函数(){
QScopedPointer项(新QFile(“文件名”);
SomeClassObject->doStuff(item.data());
item.take();
}
---------------------------------
SomeClass::doStuff(QIODevice*项){
_currentObject=new MyObject(item);//currentObject是否应为smartpointer?
...
}
---------------------------------
类MyObject{
QPointer_项目;
...
MyObject(QIODevice*项){u项=项;}
}

因此,我需要一种存储指针的方法,以及一种在“new”引发异常时在创建过程中处理指针的方法

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

对于您的代码,
SomeClass::doStuff()
应该有一个
QScopedPointer
参数(而不是
QIODevice*
参数),因为您正在将
传递给它,它具有该类型

MyObject
的构造函数相同:让它接受
QPointer
QSharedPointer
类型的参数。通常,在使用指针的任何地方,都可以使用
QSharedPointer
(使用适当的模板类型)。这将使您避免以后访问已删除对象时遇到的麻烦

当然,有时您实际上需要原始
QIODevice
指针(例如,对于第三方库调用),然后您将使用共享指针对象的
data()
成员函数。只需确保不会持久化(即存储或复制超出必要范围的)返回的原始指针,因为这将削弱共享指针的用途——共享指针将不知道不在共享指针对象管理下的额外原始指针

编辑:
take()。当您将所有权转让给其他对象时,您可能不想使用它,比如您将所有权转让给
MyObject

我认为没有充分的理由将函数的参数设置为
QScopedPointer
。要么将其作为引用(完全避免指针),要么将其作为原始指针(允许所有托管指针类型),要么将其作为共享指针(避免复制并使
\u currentObject
共享对象,如果可能的话)。传递作用域指针必须是通过引用,然后您强制用户选择智能指针,这不是一件好事(如果他们使用的是不同类型的智能指针怎么办?)我不明白为什么传递共享指针(而不是原始指针)是一个问题(除了强制特定类型之外)。我认为这比传递原始指针更安全(例如,您可以将参数存储到全局容器中,而不用担心调用者从您下面删除它)。共享指针当然不必是通过引用的,复制构造函数逻辑将确保复制行为正确。您当然可以通过引用来传递底层对象,但是为什么要使用指针呢?它需要一个QIODevice,因为我不仅会将它与QFile一起使用。在我的代码中,还有其他一些情况下函数需要basetype@chikuba-您可以将
QSharedPointer
转换为
QSharedPointer
,因此,如果需要基类型,您可以使用该类型。但是,共享指针的目的不是在您有多个所有者时使用它吗?我最终创建的对象将是它的所有者,而不是其他任何人。我不能在创建对象时使用scopedpointer来处理异常,然后使用其原始指针,然后在完成所有操作后将其存储在所有者处吗?
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; }
}