Зачем мне нужен конструктор по умолчанию в QVector <MyClass>? - PullRequest
0 голосов
/ 18 января 2019

У меня проблемы с компиляцией следующего:

#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;
}

Если быть точным, строка дополнения не будет компилироваться.

Почему в этом случае элемент должен иметь конструктор по умолчанию?

1 Ответ

0 голосов
/ 18 января 2019

Причина, по которой std::vector работает по-разному, заключается в том, что в векторе необработанная неинициализированная память выделяется, а затем вызывает конструктор копирования для выполнения копирования при необходимости. Этот процесс не требует вызова конструктора по умолчанию для resize(). Вот почему нет никакой зависимости как таковой от конструктора по умолчанию.

Подробнее см. В ответе AnT здесь .

QVector требует, чтобы тип был конструируемым по умолчанию из-за способа реализации внутренней функции realloc().

Источник: Понимание контейнеров Qt

...