2012-03-23 191 views
4

一直试图了解几天共享指针,感觉就像我似乎无法得到它。不知道它是否明显或太复杂。首先,任何人都可以给我一个例子,你会真正使用共享指针。维基百科上的例子对我来说毫无意义。你将如何将共享指针传递给另一个函数或使用共享指针创建一个对象。那么,你如何传递它,你会在哪里使用它?任何信息或例子都会很棒。QSharedPointer,如何传递它们,我需要它们吗?

另外,我有这个问题,我不知道该用什么。我有这个功能,我分配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; } 
} 

所以我想要一种方法来存储指针,并在创建过程中处理它们,如果“新”引发异常。

回答

8

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

至于你的代码,SomeClass::doStuff()应该有一个QScopedPointer<QFile>参数(而不是QIODevice*之一)为您传递item到它,这有型。

同的构造函数:是否需要参数QPointer<QIODevice>QSharedPointer<QIODevice>类型。一般来说,在任何需要使用指针的地方,都可以使用QSharedPointer(使用适当的模板类型)。这将使您免于后来与访问已删除对象相关的麻烦。

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

编辑: take()从一个作用域指针释放指向对象的所有权,所以当作用域指针被销毁时,它不会删除该对象。当您将所有权转让给其他人时,您将不会使用它 - 例如您的情况为MyObject

+1

我没有看到让函数的参数成为'QScopedPointer'的好理由。或者使它成为* reference *(完全避免指针),将它作为一个原始指针(允许*所有*管理的指针类型)或使它成为一个共享指针(避免复制并使'_currentObject'共享对象,如果这是一个可能性)。传递作用域指针必须通过引用,然后强制用户选择智能指针,这不是一件好事(如果他们使用不同类型的智能指针,该怎么办?) – 2012-03-23 02:36:39

+1

我没有看到为什么传递共享指针(而不是原始指针)是一个问题(除了强制特定类型之外)。我认为这比传递原始指针更安全(例如,您可以将参数存储到全局容器中,而不必担心调用者将它从您的下面删除)。共享指针当然不一定要通过引用,复制构造函数逻辑将确保副本的行为适当。你当然可以通过引用传递底层对象,但为什么要使用指针呢? – Attila 2012-03-23 02:45:32

+0

它需要采取QIODevice,因为我不仅将它与QFile一起使用。在我的代码中还有其他一些情况,其中函数需要基类型 – chikuba 2012-03-23 03:05:40

相关问题