avb*_*avb 3 qt containers smart-pointers qt5 qscopedpointer
我正在尝试将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) : while compiling class template member function 'QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>::~QList(void)'
with
[
T=Label
]
..\tableview_row_dnd\main.cpp(13) : see reference to function template instantiation 'QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>::~QList(void)' being compiled
with
[
T=Label
]
..\tableview_row_dnd\main.cpp(20) : see reference to class template instantiation 'QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>' being compiled
with
[
T=Label
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(405) : 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
]
Run Code Online (Sandbox Code Playgroud)
为什么这不适合我?
存储在Qt容器中的值应该是可分配的数据类型.这意味着他们应该有一个默认构造函数,一个复制构造函数和一个赋值运算符.
QScopedPointer禁用其复制构造函数和赋值运算符.您不能为彼此分配两个指针,但您可以使用QScopedPointer::reset,QScopedPointer::swap或显式传输基础原始指针的所有权QScopedPointer::take.
在某些时候,添加了移动构造函数和移动赋值运算符QScopedPointer.新的移动语义使这成为可能:
QList<QScopedPointer<Label>> mLabels;
mLabels.append(QScopedPointer<Label>(new Label));
Run Code Online (Sandbox Code Playgroud)
这里将临时值添加到列表中,并使用移动构造函数创建新的列表项.
后来他们恢复了这个改变:
将移动构造函数添加到QScopedPointer是没有意义的,因为移动意味着"转移范围",这打破了QScopedPointer的基本点.
如果你真的想要一个智能指针列表,你可以使用QSharedPointer哪个是可分配的或std::unique_ptr支持移动语义.
如果你谈到跟踪QObjects子类的生命周期,尤其是小部件,我建议使用Qt子父机制而不是智能指针.