我需要一个指针容器来取得指针的所有权 - 即当一个元素被删除,或者容器超出范围时,它释放所有指针,就像在boost::ptr_vector
.
QList<QScopedPointer<AbstractClass> >
不起作用(编译错误,没有复制构造函数?).
现在我正在使用QList<QSharedPointer<AbstractClass> >
,但感觉就像一个矫枉过正,它的引用计数和多线程的昂贵的互斥量.
编辑:我刚刚了解了QPtrList(感谢@ForEveR),它在Qt3中非常相同,但是从更高版本中删除了.我只是不明白为什么他们会删除它.
例如,这是我的代码
QScopedPointer<QTimer> timer2(new QTimer);
Run Code Online (Sandbox Code Playgroud)
但我想定义
QScopedPointer<QTimer> timer2;
Run Code Online (Sandbox Code Playgroud)
在mainwindow.h中创建一个实例
timer2(new QTimer);
Run Code Online (Sandbox Code Playgroud)
在mainwindow.cpp中
怎么样?
在我的代码中
std::unique_ptr<QNetworkAccessManager> myNetworkAccessManager;
...
myNetworkAccessManager.reset(new QNetworkAccessManager(this));
QObject::connect(myNetworkAccessManager.get(), SIGNAL(finished(QNetworkReply *)), this, SLOT(OnNetworkFinished(QNetworkReply *)));
Run Code Online (Sandbox Code Playgroud)
有问题的代码:connect() 中的myNetworkAccessManager.get ()
我的问题是最好的方法是什么?
我正在阅读这篇文章 ,它在 Legacy Code 下说:
调用 get() 返回一个指向底层方法的指针。如果可以,您真的想避免调用它,因为一旦您将原始指针释放到野外,您就失去了通过切换到 unique_ptr 所获得的许多优势
更新
如果我改成使用如果我使用QScopedPointer,我的代码如下:
QScopedPointer<QNetworkAccessManager> myNetworkAccessManager;
...
myNetworkAccessManager.reset(new QNetworkAccessManager(this));
QObject::connect(myNetworkAccessManager.data(), SIGNAL(finished(QNetworkReply *)), this, SLOT(OnNetworkFinished(QNetworkReply *)));
Run Code Online (Sandbox Code Playgroud)
这会是正确的解决方案吗:
connect(myNetworkAccessManager.data()
Run Code Online (Sandbox Code Playgroud)
更新 2
阅读此链接stackoverflow似乎使用 data() 是正确的解决方案。这意味着使用 stl 中的 get() 也是正确的。
我正在尝试将QScopedPointers存储在QList中.
我发现了这个评论
也可以使用QList>. - Kuba Ober 2014年1月14日18:17
(首先评论这个答案:https://stackoverflow.com/a/21120575/3095014)
这篇文章https://forum.qt.io/topic/59338/solved-qlist-of-qscopedpointers暗示这应该有效.但是,如果我尝试编译第二个链接的代码,我会收到此错误:
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(404) : error C2248: 'QScopedPointer<Label,QScopedPointerDeleter<T>>::QScopedPointer' : cannot access private member declared in class 'QScopedPointer<Label,QScopedPointerDeleter<T>>'
with
[
T=Label
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qscopedpointer.h(170) : see declaration of 'QScopedPointer<Label,QScopedPointerDeleter<T>>::QScopedPointer'
with
[
T=Label
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(403) : while compiling class template member function 'void QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>::node_construct(QList<QScopedPointer<T,QScopedPointerDeleter<T>>>::Node *,const QScopedPointer<T,QScopedPointerDeleter<T>> &)'
with
[
T=Label
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(553) : see reference to function template instantiation 'void QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>::node_construct(QList<QScopedPointer<T,QScopedPointerDeleter<T>>>::Node *,const QScopedPointer<T,QScopedPointerDeleter<T>> &)' being compiled
with
[
T=Label
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(794) …
Run Code Online (Sandbox Code Playgroud) 如果我可以选择QScopedPointer
和之间做出选择boost::scoped_ptr
,在以下情况下哪一个会做得最好:
1. QScopedPointer<QObject> Vs boost::scoped_ptr<QObject>
2. QScopedPointer<QtContainer> Vs boost::scoped_ptr<QtContainer>
3. QScopedPointer::data() Vs boost::scoped_ptr::get()
Run Code Online (Sandbox Code Playgroud)