结构的QVector - 没有适当的默认构造函数可用

时间:2018-04-01 20:48:03

标签: c++ qt struct constructor qvector

我很困惑为什么这不起作用。我一定是误解了关于QVectors的关键......

我创建了一个MCVE来展示问题:

#include <QCoreApplication>
#include <QVector>

struct ChunkRequest
{
    ChunkRequest(int x, int z)
    {
        this->x = x;
        this->z = z;
    }

    int x;
    int z;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QVector<ChunkRequest> requestedChunks;

    requestedChunks.append(ChunkRequest(1, 2));

    return a.exec();
}

编译会抛出错误C2512: 'ChunkRequest' : no appropriate default constructor available

我可以使用ChunkRequest创建ChunkRequest req(1, 2);变量,但只要我尝试将其附加到我的QVector错误就会抛出。

我对其原因感到困惑。

编辑: 阅读完您的评论之后,我很清楚QVector需要一个默认构造函数来确定数组中每个元素的大小。但这并没有回答为什么。

如果一个struct有一定数量的成员且每个成员在内存中已知大小(即使指向动态内存的指针已知大小),那么我也不明白为什么QVector需要一个默认的构造函数?大小应该在编译时知道......对吗?

2 个答案:

答案 0 :(得分:3)

在C ++中指定结构(或类)的任何构造函数指示编译器自动提供默认构造函数。这是语言的一个怪癖。

容器类(例如QVector)可以动态调整大小(内部或显式),这会成为一个问题。当分配新对象来填充空间时,它将调用默认构造函数 - 但是如果没有& #39; ta默认构造函数可用,将发生编译时错误。

问题可以通过指定默认构造函数来解决,即使它没有做任何事情,例如:

ChunkRequest() {}

答案 1 :(得分:2)

  

我很清楚QVector需要一个默认的构造函数   确定数组中每个元素的大小。但这并不是   回答原因。

它与它完全无关,而构造函数决不会决定对象的大小,它们的成员布局也是如此。

默认构造函数的任务是允许设置大小的QVector构造函数和方法。该构造函数将用于初始化所有这些元素。

如果没有默认构造函数,那么这些值将是未初始化的,并且几乎无用的垃圾数据。

有一个默认的构造函数告诉你&#34;我可以构造那种类型的有意义的对象而不传递任何参数&#34;。

如果您个人不使用任何构造函数或方法并不重要,那么它仍然是类实现所必需的。

为什么它还使用构造来实现基本上保留的内存,这可能本身就值得一个问题,因为至少对我来说没有充分的理由这样做,这似乎是一个潜在的开销。