为什么在 QVector<MyClass> 中需要一个默认构造函数?

3

我在编译以下代码时遇到了问题:

#include <QVector>
#include <QDebug>
#include <vector>

class item
{
    int var;
public:
    //Without default constructor this program will not compile
    //item(){}

    item(int value)
    {
        var = value;
    }
    int getVar()
    {
        return var;
    }
};

int main()
{
    //This code will not compile
    QVector<item> y;
    y.append(item(1));
    qDebug() << y[0].getVar();

    //std::vector however will work despite an absence of a default contructor
    std::vector<item> z;
    z.push_back(item(1));
    qDebug() << z.at(0).getVar();

    return 0;
}

准确来说,这个追加行不会编译。

为什么在这种情况下item必须要有一个默认的构造函数?


可能是为了让QVector::resize能够默认构造items。 - undefined
1
vector只有在使用resize或类似的强制默认构造函数时才会出现问题。QVector可能在幕后有更多的操作。我必须把这个问题留给那些对QT非常熟悉的人来解决。 - undefined
@KunalPuri 踩 / 赞可以且应该是匿名的,因此目前不再需要要求提供理由:它已经不再需要,因为它没有做出任何贡献。如需更多信息,请查看为什么踩票不强制要求提供反馈,以及为什么建议这样做的想法被否决? - undefined
@eyllanesc 我同意你的观点。但是我有一个疑问。每当有人对一个回答进行负评时,stackoverflow都建议留下评论。那为什么这个规则不适用于问题呢? - undefined
@KunalPuri 很好的问题,也许在元站上有答案,我很久之前就不再对回答进行负评了。但我认为这只是一个建议,而不是义务。 - undefined
显示剩余5条评论
1个回答

4
std::vector 之所以表现不同,是因为在向量中,当需要时会分配 未初始化的原始内存,然后调用复制构造函数进行复制。这个过程不需要为 resize() 调用默认构造函数。这就是为什么没有对默认构造函数的依赖。

更多信息请参见AnT此处的答案。

QVector 要求类型具有默认构造函数,因为内部函数 realloc() 的实现方式。

来源:理解 Qt 容器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接