我是 c++ 和 Qt 的新手,我正在尝试初始化一个 QVector,它是类初始化列表中的类成员,例如:
MyClass::MyClass(QWidget *parent) : QMainWindow(parent) , myVector(QVector<double>(100))
我原以为 QVector 已经分配了 100 个索引,但是当我尝试读取 myVector[0]
时,我收到一个断言错误,说“test.exe 中 0x0143bf77 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004。”程序停在 Qt 的这一行:
inline T &QVector<T>::operator[](int i)
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
return data()[i]; }
我相信这表明我正在尝试访问尚未分配的成员,所以我想我没有正确使用初始化列表。我可以使它成为一个指针,并在构造函数中创建一个 new QVector(100)
但我想知道什么是错的以及如何使它正确。
原文由 Michel Feinstein 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可能在做一些未显示的错误,因为以下代码对我来说很好,而且 它应该是设计使然。请注意,对于第一个元素,您可以使用便捷的 第一方法。
主文件
主程序
输出
正如我在评论中指出的那样,您可以使用 reserve 方法。
所以,你会写这样的东西:
但是,正如我在评论后面提到的那样,简单的构造函数也应该像这样工作:
您正在做的是调用复制构造函数(尽管对于隐式共享类),因此它的速度可能可以忽略不计。它至少比您需要的代码多。