【问题标题】:QVector of struct - no appropriate default constructor availableQVector of struct - 没有合适的默认构造函数可用
【发布时间】:2018-09-11 03:36:55
【问题描述】:

我很困惑为什么这不起作用。我一定是误解了 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 req(1, 2); 创建一个ChunkRequest 变量,但是一旦我尝试将它附加到我的QVector 就会抛出错误。

我很困惑为什么。

编辑: 在阅读了您的 cmets 之后,我很清楚 QVector 需要一个默认构造函数来确定数组中每个元素的大小。但这并不能说明原因。

如果一个结构有一定数量的成员并且每个成员在内存中都有一个已知大小(甚至指向动态内存的指针也是已知大小),那么我不明白为什么 QVector 需要默认构造函数?大小应该在编译时就知道了……对吧?

【问题讨论】:

  • @MrEricSir 谢谢!所以看起来 QVector 需要一个默认构造函数来确定内存中每个元素的大小?所以要么我创建一个默认构造函数,要么在堆上创建每个元素。谢谢:)
  • 的确,是的,动态内存有效!
  • 虽然我确实发现这是 QVector 的一个奇怪要求。结构具有一定数量的成员......直接变量或指向堆分配值的指针。所以我不明白为什么 QVector 需要一个默认的构造函数来确定大小?
  • @mrg95 这有点隐藏在文档中,但a default constructor is required。每当您在 C++ 中提供构造函数时,它都会清除默认构造函数,这意味着您可能必须提供自己的构造函数(即使它是无操作的)。这只是该语言的一个怪癖。

标签: c++ qt struct constructor qvector


【解决方案1】:

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

这与它完全无关,构造函数绝不会决定对象的大小,它们的成员布局会决定。

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

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

拥有一个默认构造函数告诉你“我可以在不传递任何参数的情况下构造该类型的有意义的对象”。

如果您个人不使用任何这些构造函数或方法也没关系,但类实现需要它。

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

【讨论】:

    【解决方案2】:

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

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

    这个问题可以通过指定一个默认的构造函数来解决,即使它什么都不做,例如:

    ChunkRequest() {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 2016-01-22
      • 2014-06-23
      相关资源
      最近更新 更多