Russian Qt Forum

Qt => Общие вопросы => Тема начата: fulkabaster от Март 22, 2010, 19:39



Название: Почему некоторые классы не хотят быть базовым типом массивов?
Отправлено: fulkabaster от Март 22, 2010, 19:39
Например, юзая графики из библиотеки QWT, хочу создать кучку маркеров для подписей. Чтобы не создавать их десятками вручную, делаю массив типа QVector<QwtPlotMarker>. Но при компиляции выдается такое:

Цитировать
../qwt/qwt-5.2.0/src/qwt_plot_item.h: In copy constructor ‘QwtPlotMarker::QwtPlotMarker(const QwtPlotMarker&)’:
../qwt/qwt-5.2.0/src/qwt_plot_marker.h:46:   instantiated from ‘void QVector<T>::realloc(int, int) [with T = QwtPlotMarker]’
/usr/include/QtCore/qvector.h:303:   instantiated from ‘void QVector<T>::resize(int) [with T = QwtPlotMarker]’
chargaff.cpp:107:   instantiated from here
../qwt/qwt-5.2.0/src/qwt_plot_item.h:192: error: ‘QwtPlotItem::QwtPlotItem(const QwtPlotItem&)’ is private
../qwt/qwt-5.2.0/src/qwt_plot_marker.h:46: error: within this context
/usr/include/QtCore/qvector.h: In member function ‘void QVector<T>::realloc(int, int) [with T = QwtPlotMarker]’:
/usr/include/QtCore/qvector.h:475: note: synthesized method ‘QwtPlotMarker::QwtPlotMarker(const QwtPlotMarker&)’ first required here

Причем пробовал заменить массив с QVector на QList и даже на просто vector<> из STL - нифига.
Можно пофиксить?


Название: Re: Почему некоторые классы не хотят быть базовым типом массивов?
Отправлено: pastor от Март 22, 2010, 19:50
Причина ошибки в том, что:

Цитировать
QList's value type must be an assignable data type.

Цитировать
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.

а согласно сообщению об ошибке:

Код
C++ (Qt)
error: ‘QwtPlotItem::QwtPlotItem(const QwtPlotItem&)’ is private

копирующий конструктор запривачен.

Побороть можно:

Код
C++ (Qt)
QList<QwtPlotMarker *> list;
....
 
list.append(new QwtPlotMarker());

Незабывает только освобождать память выделенную под элементы листа.

Вышесказанное праведливо и для QVector.


Название: Re: Почему некоторые классы не хотят быть базовым типом массивов?
Отправлено: SASA от Март 22, 2010, 20:15
Можно отнаследоваться от QwtPlotMarker и определить конструктор копирования и оператор присваивания. Но делать это крайне аккуратно, прочитав http://doc.trolltech.com/4.4/object.html#identity-vs-value (http://doc.trolltech.com/4.4/object.html#identity-vs-value)