QVector指针的指针

时间:2014-07-22 21:09:20

标签: c++ qt pointers

这是我的类构造函数:

UndoRedo::UndoRedo(QList<vector_t*> v,
                   QUndoCommand *parent)
    : QUndoCommand(parent)
{  
    ...
    QStringList *sl = &v[0][0];
    ...
}

vector_t

的位置
typedef QVector<QStringList> vector_t ;

当我尝试以这种方式设置“sl”时,IDE会引发此错误:

no match for ‘operator*’ (operand type is ‘QList<QVector<QStringList>*>’)

我做错了什么?你能救我吗?

1 个答案:

答案 0 :(得分:4)

我在你的问题中看到的最大问题是你似乎过于复杂的简单事情。首先,Qt的容器是隐式共享的。因此,如果不修改所述副本,则获取它们的副本是便宜的。因此,您可以通过引用自由地传递最外面的容器,并按值获取内部。

例如,将QList<vector_t>简单地传递给您的方法,相当便宜。它不涉及任何形式的复制。即使这样,传递const引用而不是值const QList<vector_t> &也会花费少一点。

你为什么要取v的地址?让我们剖析v

的类型
QList<vector_t*> = QList<QVector<QStringList>>*>

要访问您需要的最内层元素:

  1. 访问列表元素:v[0]
  2. 取消引用指针:*exp
  3. 访问向量元素:exp[0]
  4. exp我的意思是前面的表达式,作为一个单元。

    因此:

    QStringList & sl = (*(v[0]))[0];
    

    这是C ++,而不是C,你应该使用引用而不是指针。

    如果你坚持使用指针:

    QStringList * sl = *((*(v[0]))[0]);
    

    但是你可以做一些愚蠢的事情,比如delete slfree(sl),它会编译,但会导致你的硬盘被格式化。