如何正确地将对象/指针存储到 Qlist 中
Posted
技术标签:
【中文标题】如何正确地将对象/指针存储到 Qlist 中【英文标题】:How to properly store objects/pointers into a Qlist 【发布时间】:2018-05-18 07:27:53 【问题描述】:我是 Qt 的新手,我遇到了这一行:
QList<Class*>* _lstChildren = new QList<Class*>();
该类派生自另一个类并在其中具有各种构造函数。
我很好奇:为什么要使用额外的*
,最后的()
是什么意思?
【问题讨论】:
您认为哪个*
是多余的?在我看来,它们都是正确的。
额外的*
表示它是一个指向QList<Class*>
对象的指针。最后的括号表示应该调用QList<Class*>
的默认构造函数。
请注意,使用new
创建QList
没有任何好处,它是一个隐式共享的容器类,并在内部使用动态内存分配。
【参考方案1】:
与 Qt 无关,纯 C++ 语法
QList<Class*>
- 类型
QList<Class*>* _lstChildren
- 变量,指向上述类型的指针
= new QList<Class*>()
- 通过 new-expression 初始化指针变量
QList
是 std::deque
、std::list
的 Qt 模拟(不是两者的直接等价物),Class*
是作为模板参数传递的存储类型。
()
这里是 new 表达式的一部分,用指向 QList<Class*>
类型的已创建对象的值初始化指针。
在这种情况下它正在调用默认构造函数 - 括号内没有提供任何参数。如果QList
根本没有构造函数,则表示已创建对象的值初始化(按零)。
您的列表包含原始指针,因此您必须为其提供指向 Class*
的指针,例如在动态内存中创建对象。
QList<Class*>* lstChildren = new QList<Class*>();
Class* child1= new Class();
lstChildren->append(child1);
它发生了,所以QList
不应该删除那些指针指向的对象,它只会破坏指针本身。要清理,您必须使用
qDeleteAll(*lstChildren);
lstChildren->clear();
或单独删除它们(并从列表中删除)。
【讨论】:
【参考方案2】:没有“额外的”*
。
QList<Class*>* _lstChildren = new QList<Class*>();
_lstChildren
是*
指向QList
的指针,由*
指向Class
的指针组成
而()
位于new QList<Class*>()
的末尾,因为QList<Class*>
对象是由value initalization 初始化的。
【讨论】:
在 QList 的情况下,末尾的 () 并不是真正需要的。它不存在意味着将调用默认构造函数。如果类没有用户定义的构造函数,它的存在意味着值初始化。 @Mike 我试图剖析new QList<Class*>()
声明的全部内容。我看到这令人困惑。【参考方案3】:
1- 如果你放了额外的'*',那么_lstChildren 将是一个指向包含一些类'class' 指针的QList 的指针。您可以将其删除,然后将 _lstChildren 用作普通变量。
2- 需要结尾 '()'。为什么?因为 QList() 是 QList 的构造函数。您在创建自己的类的变量时已经看到了它。
3- 正如 Qt 公司建议的那样,最好使用QScopedPointer 而不是原始指针。这保证了当前范围消失时指向的对象将被删除,您无需手动管理对象。
【讨论】:
以上是关于如何正确地将对象/指针存储到 Qlist 中的主要内容,如果未能解决你的问题,请参考以下文章