LINUX.ORG.RU

Qt Vector


0

0

/../../src/corelib/tools/qvector.h: In member function 'void QVector<T>::append(const T&) [with T = PIN]':
/../../src/corelib/tools/qvector.h:552: note: synthesized method 'PIN& PIN::operator=(const PIN&)' first required here

В чём дело ? Разве нельзя использовать QVector со своими классами ?

QVector<PIN> PINs;

Падает тут:

PIN *a = new PIN(this);
PIN *b = new PIN(this);
this->PINs.append(*a); // <- Problem
this->PINs.append(*b);


В чём дело ?

/../../src/corelib/tools/qvector.h:552: note: synthesized method 'PIN& PIN::operator=(const PIN&)' first required here

какое слово тебе не понятно?

jtootf ★★★★★
()

а чего бы не написать:

PINs.push_back(*a);
shty ★★★★★
()
Ответ на: комментарий от red1ynx

ну, в тривиальном случае на каждый new должен приходиться delete, мы видим 2 new и ни одного delete

пруф:

PIN *a = new PIN(this);
PIN *b = new PIN(this);
shty ★★★★★
()
Ответ на: комментарий от ahonimous

> а еще у тебя ненужное копирование объекта - делай vec.resize( vec.size() + 1 )

Во-первых, vec.resize() проинициализирует новые значения конструкторами по умолчанию, а после присвоения будет неявно вызван лишний деструктор и оператор копирования. Если хочется секономить на реаллокации памяти и операторах - для этого существует QVector::reserve().

Ещё вектор при реаллокации массива сам заранее зарезервирует больше, чем один элемент, чтобы уменьшить накладные расходы идущие друг за другом append().

Dendy ★★★★★
()
Ответ на: комментарий от jtootf

> QObjects organize themselves in object trees.

When you create a QObject with another object as parent, the object will automatically add itself to the parent's children() list.

The parent takes ownership of the object; i.e., it will automatically delete its children in its destructor.


У него this в конструкторах и есть parent. А удаляется ли объект, в котором выполняется весь указанный код, никакой информации в теме нет.

PayableOnDeath
()
Ответ на: комментарий от ahonimous

Тем трем ребятам:
1. Код вырван из контекста, мот там дальше delete стоит.
2. Насчет парента уже сказали (:

red1ynx
()
Ответ на: комментарий от PayableOnDeath

> У него this в конструкторах и есть parent

про QObject в оригинальном тексте не нет, ну и наследоваться от QObject только чтоб не делать delete( а его и так не надо делать - все-равно в вектор складываются не указатели ) - это лишние затраты и памяти и времени работы

ahonimous
()
Ответ на: комментарий от PayableOnDeath

> У него this в конструкторах и есть parent.

У QObject запрещён оператор копирования. Можно было бы конечно предположить, что используется какая-то своя иерархия, но судя по коду автору бы с простыми С++-задачками разобраться (-:

Dendy ★★★★★
()

Во-первых, оператор присваивания у класса PIN оппределен? Во-вторых, Кто есть PIN? от кого наследуется?

irq
()

QtVector

В Qt контейнеры могут работать только с классами у которых есть доступные оператор присваивания и конструктор копирования. В противном случае рекомендуется хранить в контейнере указатели на объекты.

В данном случае у класса PIN отсутствует доступный оператор присваивания.

P.S. на заметку объекты унаследованные от QObject не имеют доступного оператора присваивания и конструктора копирования.

Thrushbeard
()
Ответ на: QtVector от Thrushbeard

> В Qt контейнеры могут работать только с классами у которых есть доступные оператор присваивания и конструктор копирования. В противном случае рекомендуется хранить в контейнере указатели на объекты.

Для работы требуется только конструктор копирования, оператор присваивания не нужен. Это все в точности справедливо и для контейнеров stl.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.