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 требуется конструктор по умолчанию для определения размера каждого элемента в массиве. Но это не отвечает почему.

Если структура имеет определенное количество членов и каждый член имеет известный размер в памяти (даже указатели на динамическую память имеют известный размер), тогда я не понимаю, почему QVector требуется конструктор по умолчанию? Размер должен быть известен во время компиляции... верно?

2 ответа

Решение

В C++ указание любого конструктора для структуры (или класса) указывает компилятору не предоставлять конструктор по умолчанию автоматически. Это причуда языка.

Это становится проблемой для контейнерных классов, таких как QVector который может изменить размер на лету (внутренне или явно). При выделении новых объектов для заполнения пространства он вызовет конструктор по умолчанию - но если конструктор по умолчанию недоступен, произойдет ошибка времени компиляции.

Эту проблему можно решить, указав конструктор по умолчанию, даже если он ничего не делает, например:

ChunkRequest() {}

мне ясно, что QVector требуется конструктор по умолчанию для определения размера каждого элемента в массиве. Но это не отвечает почему.

он не имеет к этому никакого отношения, и конструкторы никоим образом не определяют размер объектов, как это делает их элемент-макет.

То, что обязывает конструктор по умолчанию, это QVector конструкторы и методы, позволяющие установить размер. Этот конструктор будет использоваться для инициализации всех этих элементов.

Без конструктора по умолчанию значения были бы неинициализированы и в значительной степени бесполезны.

Наличие конструктора по умолчанию говорит вам: "Я могу создавать значимые объекты этого типа без передачи каких-либо параметров".

Неважно, если вы лично не используете ни один из этих конструкторов или методов, это все же требуется реализацией класса.

Что касается того, почему он также использует конструкцию для того, что в основном является зарезервированной памятью, это, вероятно, заслуживает вопроса само по себе, потому что, по крайней мере, для меня нет веских причин делать это вообще, это кажется потенциальными накладными расходами.

Другие вопросы по тегам