>

그래서 구조가 있습니다 :

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

    std :: vector가 다르게 작동하는 이유는 벡터에서 초기화되지 않은 원시 메모리가 할당 된 다음 필요할 때마다 복사 생성자를 호출하여 복사를 수행한다는 사실에 있습니다. 이 프로세스는 resize ()에 대한 기본 생성자를 호출 할 필요가 없습니다. 이것이 기본 생성자에 대한 의존성이없는 이유입니다.

    반면에, QVector는 내부 함수 realloc ()이 구현되는 방식 때문에 type을 기본적으로 구성 할 수 있어야합니다.

    QT 문서에 따르면 :

    와이즈 비즈

    The values stored in the various containers can be of any assignable data type. To qualify, a type must provide a default constructor, a copy constructor, and an assignment operator. This covers most data types you are likely to want to store in a container, including basic types such as int and double, pointer types

  • 이전 java - 다음 30 일 이내에 만료되는 레코드를 선택하십시오SQL 문
  • 다음 java - DAL을 사용하여 데이터로 콤보 상자 채우기