c++ - QVector指针的指针

标签 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>*>’)

我哪里做错了?你能帮帮我吗?

最佳答案

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

例如,简单地传递 QList<vector_t> 会相当便宜到你的方法。它不涉及任何形式的复制。即便如此,传递一个 const 引用而不是一个值的成本要低一点,即 const QList<vector_t> & .

为什么要使用 v 的地址? ?让我们剖析 v 的类型:

QList<vector_t*> = QList<QVector<QStringList>>*>

要访问最里面的元素,您需要:

  1. 访问列表元素:v[0]
  2. 取消引用指针:*exp
  3. 访问 vector 元素:exp[0]

通过 exp我的意思是前面的表达式,作为一个单元。

因此:

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

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

如果你坚持使用指针:

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

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

关于c++ - QVector指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24897898/

相关文章:

c++ - 如何在 std::ofstream 和 std::cerr 之间切换

javascript - 在 qt 应用程序中集成 Svg 和 Javascript

pointers - 无法正确取消引用指针并从内存地址数组中获取实际值

c - C中指针的大小

c++ - 关于带有签名 void *data 的参数的非常基本的问题

c++ - 在 QListWidget 的 QStyledItemDelegate 中,如何绘制所选项目以匹配标准列表?

c++ - 在 OpenGL 中清除场景和刷新变量

c++ - 如何在 cmake 中检查给定的头文件是否可用于 C++ 项目

c++ - 在qt和customplot库绘制曲线中绘制图形

c++ - 如何始终向下打开QComboBox弹出窗口?