QVector vs std :: vector для сложных типов - PullRequest
2 голосов
/ 07 марта 2019

Итак, у меня есть структура:

struct Alarm{
    Alarm(QString operation, double comparison, QString text, quint8 color):
        operation(operation), comparison(comparison), text(text), color(color){}

    int             element;
    QString         operation;
    double          comparison;

    QString         text;
    quint8          color;

    QDateTime       riseTime;
};

Обратите внимание, что у него нет конструктора по умолчанию Alarm().Я хотел бы иметь векторный контейнер объектов этой структуры.Если я пытаюсь использовать QVector, код не компилируется в коде, где я пытаюсь добавить новый объект с этой ошибкой:

/usr/include/x86_64-linux-gnu/qt5/QtCore/qvector.h: In instantiation of ‘void QVector<T>::defaultConstruct(T*, T*) [with T = Alarm]’:
/usr/include/x86_64-linux-gnu/qt5/QtCore/qvector.h:580:41:   required from ‘void QVector<T>::reallocData(int, int, QArrayData::AllocationOptions) [with T = Alarm; QArrayData::AllocationOptions = QFlags<QArrayData::AllocationOption>]’
/usr/include/x86_64-linux-gnu/qt5/QtCore/qvector.h:654:20:   required from ‘void QVector<T>::append(const T&) [with T = Alarm]’
/usr/include/x86_64-linux-gnu/qt5/QtCore/qvector.h:280:13:   required from ‘QVector<T>& QVector<T>::operator<<(const T&) [with T = Alarm]’
/opt/buildagent/work/1a89dfc8903ef3d7/ground/gcs/src/plugins/qmlview/Alarms.cpp:56:243:   required from here
/usr/include/x86_64-linux-gnu/qt5/QtCore/qvector.h:322:13: error: no matching function for call to ‘Alarm::Alarm()’
          new (from++) T();

Похоже, что QVector требует, чтобы класс, который он содержит, имелконструктор по умолчанию.Однако, использование std::vector<T> компилирует просто отлично.

Мой вопрос - почему?Требуется ли для использования QVector иметь класс с конструктором по умолчанию?Или я не правильно использую контейнер?

1 Ответ

1 голос
/ 07 марта 2019

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

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

согласнок документам QT:

Значения, хранящиеся в различных контейнерах, могут иметь любой назначаемый тип данных.Для квалификации тип должен предоставить конструктор по умолчанию, конструктор копирования и оператор присваивания.Это охватывает большинство типов данных, которые вы, вероятно, захотите хранить в контейнере, включая базовые типы, такие как int и double, типы указателей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...