如何正确地将对象/指针存储到 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&lt;Class*&gt;对象的指针。最后的括号表示应该调用QList&lt;Class*&gt;的默认构造函数。 请注意,使用new 创建QList 没有任何好处,它是一个隐式共享的容器类,并在内部使用动态内存分配。 【参考方案1】:

与 Qt 无关,纯 C++ 语法

QList&lt;Class*&gt; - 类型 QList&lt;Class*&gt;* _lstChildren - 变量,指向上述类型的指针 = new QList&lt;Class*&gt;() - 通过 new-expression 初始化指针变量

QListstd::dequestd::list 的 Qt 模拟(不是两者的直接等价物),Class* 是作为模板参数传递的存储类型。

() 这里是 new 表达式的一部分,用指向 QList&lt;Class*&gt; 类型的已创建对象的值初始化指针。

在这种情况下它正在调用默认构造函数 - 括号内没有提供任何参数。如果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&lt;Class*&gt;() 的末尾,因为QList&lt;Class*&gt; 对象是由value initalization 初始化的。

【讨论】:

在 QList 的情况下,末尾的 () 并不是真正需要的。它不存在意味着将调用默认构造函数。如果类没有用户定义的构造函数,它的存在意味着值初始化。 @Mike 我试图剖析new QList&lt;Class*&gt;() 声明的全部内容。我看到这令人困惑。【参考方案3】:

1- 如果你放了额外的'*',那么_lstChildren 将是一个指向包含一些类'class' 指针的QList 的指针。您可以将其删除,然后将 _lstChildren 用作普通变量。

2- 需要结尾 '()'。为什么?因为 QList() 是 QList 的构造函数。您在创建自己的类的变量时已经看到了它。

3- 正如 Qt 公司建议的那样,最好使用QScopedPointer 而不是原始指针。这保证了当前范围消失时指向的对象将被删除,您无需手动管理对象。

【讨论】:

以上是关于如何正确地将对象/指针存储到 Qlist 中的主要内容,如果未能解决你的问题,请参考以下文章

指向 QList 中元素的指针

如何正确地将url存储在数据库中?

如何正确地将数据从 vue 组件发布到 laravel 控制器

将 QFile 正确存储在集合中

如何正确地将浮点指针从 C 库传递到其 C# 包装器

QList内存释放(看它内部存储的是否是Object,另外还有qDeleteAll)