这是我的类构造函数:
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>*>’)
我哪里做错了?你能帮帮我吗?
最佳答案
我在你的问题中看到的最大问题是你似乎严重地过度复杂化了简单的事情。首先,Qt 的容器是隐式共享的。因此,如果不修改所述拷贝,则获取它们的拷贝很便宜。因此,您可以通过引用自由传递最外层的容器,并让它按值获取内部内容。
例如,简单地传递 QList<vector_t>
会相当便宜到你的方法。它不涉及任何形式的复制。即便如此,传递一个 const 引用而不是一个值的成本要低一点,即 const QList<vector_t> &
.
为什么要使用 v
的地址? ?让我们剖析 v
的类型:
QList<vector_t*> = QList<QVector<QStringList>>*>
要访问最里面的元素,您需要:
- 访问列表元素:
v[0]
- 取消引用指针:
*exp
- 访问 vector 元素:
exp[0]
通过 exp
我的意思是前面的表达式,作为一个单元。
因此:
QStringList & sl = (*(v[0]))[0];
这是 C++,不是 C,你应该使用引用而不是指针。
如果你坚持使用指针:
QStringList * sl = *((*(v[0]))[0]);
但是你可以做一些愚蠢的事情,比如 delete sl
或 free(sl)
它会编译,但可能会导致您的硬盘被格式化。
关于c++ - QVector指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24897898/