如何将对象/指针正确存储到Qlist中

时间:2018-05-18 07:27:53

标签: c++ qt pointers object qlist

我是Qt的新手,我遇到了这一行:

    QList<Class*>* _lstChildren = new QList<Class*>(); 

其中类派生自另一个类,并且其中包含各种构造函数。

我很好奇:为什么要使用额外的*以及最后的()是什么意思?

3 个答案:

答案 0 :(得分:6)

与Qt无关,它是纯粹的C ++语法

  • QList<Class*> - 输入
  • QList<Class*>* _lstChildren - 变量,指向上述类型的指针
  • = new QList<Class*>() - 通过new-expression
  • 初始化指针变量

QList是Qt类似std::dequestd::list(不是直接等效的),Class*是要作为模板参数传递的类型。

()这里是初始化指针的新表达式的一部分,其值指向QList<Class*>类型的创建对象。

在这种情况下调用默认构造函数 - 括号内没有提供参数。如果QList根本没有构造函数,则意味着创建对象的值初始化(通过零)。

您的列表包含原始指针,因此您必须指向Class*,例如在动态内存中创建对象。

QList<Class*>* lstChildren = new QList<Class*>(); 

Class* child1= new Class();
lstChildren->append(child1);

它发生了QList不应该删除那些指针所指向的对象,它只会破坏指针本身。要清理,你必须使用

qDeleteAll(*lstChildren);
lstChildren->clear();

或单独删除它们(并从列表中删除)。

答案 1 :(得分:0)

没有&#34;额外&#34; *

QList<Class*>* _lstChildren = new QList<Class*>(); 

_lstChildren是指向*的指针QList,其中包含指针*Class

()位于new QList<Class*>()的末尾,因为QList<Class*>对象由value initalization初始化。

答案 2 :(得分:0)

1-如果添加多余的'*',则_lstChildren将是指向QList的指针,该列表包含一些类'class'的指针。您可以删除它,然后将_lstChildren用作普通变量。

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

3-如Qt公司建议,最好使用QScopedPointer代替原始指针。这样可以保证当当前作用域消失时,指向的对象将被删除,并且您无需手动管理对象。