Название: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 09, 2009, 16:05 Создаю простой класс:
Код: class A{ в функции main пишу: QVector<A> list; Все ок, компилится и работает... Но стоит в класс А добавить переменную типа класса B, который порожден от QObject то программа перестает компилиться. Пишет: fatal error C1001: An internal error has occurred in the compiler. Код: class B : public QObject Я так понимаю, что нужно добавлять не сам класс B а определенным образом описанный класс BItem, но каким образом его описывать я не нашел... С другой стороны ведь QString спокойно добавляется в QVector... Подскажите плиз или киньте прямые линки. Спасибо. p.s. Если во 2м случае из main QVector<A> list;то все ок. Название: Re: Не получается подружиться с QVector Отправлено: Rcus от Июль 09, 2009, 16:10 И вы надеетесь что компилятор сможет создать конструктор копирования для класса содержащего некопируемые объекты?
Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 09, 2009, 16:12 И вы надеетесь что компилятор сможет создать конструктор копирования для класса содержащего некопируемые объекты? Так что надо сделать? Название: Re: Не получается подружиться с QVector Отправлено: Авварон от Июль 09, 2009, 16:12 определить конструктор копирования видимо
Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 09, 2009, 16:15 определить конструктор копирования видимо Я не совсем понимаю... Почему объекты порожденные от QObject - некопируемые? Не могли бы вы написать как именно должен выглядеть конструктор копирования в данном случае? Название: Re: Не получается подружиться с QVector Отправлено: pastor от Июль 09, 2009, 16:17 Конструктор копирования ненужен. Делай так:
Код
Название: Re: Не получается подружиться с QVector Отправлено: pastor от Июль 09, 2009, 16:21 Вот по поводу конструктора копирования и оператора присваивания для класса QObject и всех порожденных от него классов:
Цитировать No copy constructor or assignment operator QObject has neither a copy constructor nor an assignment operator. This is by design. Actually, they are declared, but in a private section with the macro Q_DISABLE_COPY(). In fact, all Qt classes derived from QObject (direct or indirect) use this macro to declare their copy constructor and assignment operator to be private. The reasoning is found in the discussion on Identity vs Value on the Qt Object Model page. The main consequence is that you should use pointers to QObject (or to your QObject subclass) where you might otherwise be tempted to use your QObject subclass as a value. For example, without a copy constructor, you can't use a subclass of QObject as the value to be stored in one of the container classes. You must store pointers. А вот собственно по твоей ошибке: Цитировать 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, and Qt data types such as QString, QDate, and QTime, but it doesn't cover QObject or any QObject subclass (QWidget, QDialog, QTimer, etc.). If you attempt to instantiate a QList<QWidget>, the compiler will complain that QWidget's copy constructor and assignment operators are disabled. If you want to store these kinds of objects in a container, store them as pointers, for example as QList<QWidget *>. Вобщем rtfm Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 09, 2009, 16:22 Конструктор копирования ненужен. Делай так: Код
нужно чтобы в классе A было два поля типа B, а вектор содержал бы значения типа А.... Название: Re: Не получается подружиться с QVector Отправлено: Авварон от Июль 09, 2009, 16:24 pastor типа "мы не смогли договориться как сравнивать QObject'ы и потому запретили это делать нафиг"?
Название: Re: Не получается подружиться с QVector Отправлено: Rcus от Июль 09, 2009, 16:24 Я не совсем понимаю... Для полиморфных объектов сама операция копирования не имеет смысла(не только наследников QObject, но вообще), возможно только клонирование объекта, но и оно не всегда работает (как например клонировать сокет, файл, виджет?) поэтому нужно понять какая вам нужна семантика при копировании объекта класса A, а затем реализовать ее в конструкторе копирования.Почему объекты порожденные от QObject - некопируемые? Не могли бы вы написать как именно должен выглядеть конструктор копирования в данном случае? Название: Re: Не получается подружиться с QVector Отправлено: pastor от Июль 09, 2009, 16:31 pastor типа "мы не смогли договориться как сравнивать QObject'ы и потому запретили это делать нафиг"? Пояснение этого приводится в ассистанте в описание Qt Object Model Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 09, 2009, 16:33 pastor типа "мы не смогли договориться как сравнивать QObject'ы и потому запретили это делать нафиг"? Пояснение этого приводится в ассистанте в описание Qt Object Model Так нужен ли конструктор копирования или как-то подругому можно сделать? Название: Re: Не получается подружиться с QVector Отправлено: Авварон от Июль 09, 2009, 16:36 pastor типа "мы не смогли договориться как сравнивать QObject'ы и потому запретили это делать нафиг"? Пояснение этого приводится в ассистанте в описание Qt Object Model Название: Re: Не получается подружиться с QVector Отправлено: BRE от Июль 09, 2009, 16:47 я охотно верю, что они это еще и красиво обосновали... все равно тупо А как можно сравнивать QObject, а как можно сравнивать его наследников?Как можно сравнить QListView и QFtp? Кто больше? :) Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 09, 2009, 16:55 я охотно верю, что они это еще и красиво обосновали... все равно тупо А как можно сравнивать QObject, а как можно сравнивать его наследников?Как можно сравнить QListView и QFtp? Кто больше? :) Причем тут сравнивание? Речь идет просто о том почему базовые классы в QVector нормально работают, а порожденные от QOobject нет... Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 09, 2009, 17:01 Поставлю немного по-другому вопрос...
Нужно чтоб работало следующее: Код: class B : public QObject Напишите плиз, что конкретно нужно дописать чтобы данный код компилился? Спасибо. Название: Re: Не получается подружиться с QVector Отправлено: Rcus от Июль 09, 2009, 17:06 Честно говоря, когда игнорируют развернутые ответы дальнейшее желание писать пропадает, но на этот раз отвечую: "добавить * между A и >"
Название: Re: Не получается подружиться с QVector Отправлено: pastor от Июль 09, 2009, 17:09 А чем компилишь то? У меня вот такой код прекрасно собрался:
Код
Qt 4.5.2, MSVC 2008 + SP1. Под линуксом не проверял ЗЫ: Аж интересно стало. У кого сейчас есть возможность скомпилить gcc? Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 09, 2009, 17:14 А чем компилишь то? У меня вот такой код прекрасно собрался: Код
Qt 4.5.2, MSVC 2008 + SP1. Под линуксом не проверял ЗЫ: Аж интересно стало. У кого сейчас есть возможность скомпилить gcc? странно... Qt 4.4.3, msvc 2005... может дело в Qt... вечером попробую дома на последней версии Qt собрать) Название: Re: Не получается подружиться с QVector Отправлено: f-r-o-s-t от Июль 09, 2009, 17:24 ЗЫ: Аж интересно стало. У кого сейчас есть возможность скомпилить gcc? Скомпилировался. Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 09, 2009, 17:35 А чем компилишь то? У меня вот такой код прекрасно собрался: Код
Qt 4.5.2, MSVC 2008 + SP1. Под линуксом не проверял ЗЫ: Аж интересно стало. У кого сейчас есть возможность скомпилить gcc? А вот попробуй такой код скомпилить: Код: class B : public QObject скомпилится? Название: Re: Не получается подружиться с QVector Отправлено: pastor от Июль 09, 2009, 17:39 Даже не буду пробовать - не скомпилится. Причина описана выше (впрочем как и решение).
Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 09, 2009, 17:43 Даже не буду пробовать - не скомпилится. Причина описана выше (впрочем как и решение). Извиняюсь за тупость но я так и не понял решения... :( вы имеете ввиду оператор присваивания? Как его написать для данного случая? еще раз извиняюсь) Название: Re: Не получается подружиться с QVector Отправлено: pastor от Июль 09, 2009, 17:47 Код
Название: Re: Не получается подружиться с QVector Отправлено: f-r-o-s-t от Июль 09, 2009, 17:49 Извиняюсь за тупость но я так и не понял решения... :( вы имеете ввиду оператор присваивания? Как его написать для данного случая? еще раз извиняюсь) Честно говоря, когда игнорируют развернутые ответы дальнейшее желание писать пропадает, но на этот раз отвечую: "добавить * между A и >" Название: Re: Не получается подружиться с QVector Отправлено: ритт от Июль 09, 2009, 18:01 Авварон, низачОт )
Название: Re: Не получается подружиться с QVector Отправлено: panAlexey от Июль 09, 2009, 18:33 я охотно верю, что они это еще и красиво обосновали... все равно тупо А как можно сравнивать QObject, а как можно сравнивать его наследников?Как можно сравнить QListView и QFtp? Кто больше? :) Получаешь указатель, приводишь к инту или к лонгу и сравниваешь. правда толку мало - логичны только 2 операции равно и не равно. остальные толку использовать нет(я не вижу по крайней мере). фишка кстати полезная и используемая. пс. на всякий случай я веду речь об экземплярах, но никак не о их содержании. Название: Re: Не получается подружиться с QVector Отправлено: BRE от Июль 09, 2009, 18:40 и чего тут нереального? Так это сравнение указателей, а не объектов. Получаешь указатель, приводишь к инту или к лонгу и сравниваешь. правда толку мало - логичны только 2 операции равно и не равно. На счет полезной фишки не понял? Чем полезно сравнивать указатели на разные объекты? ;) Название: Re: Не получается подружиться с QVector Отправлено: panAlexey от Июль 09, 2009, 19:00 и чего тут нереального? На счет полезной фишки не понял?Получаешь указатель, приводишь к инту или к лонгу и сравниваешь. правда толку мало - логичны только 2 операции равно и не равно. Чем полезно сравнивать указатели на разные объекты? ;) Перебираем массив и выполняем однородное_действие а когда встречается "тот который" (естественно сравнивается указатель операцией равно) то выполняем и дополнительное_действие с ним. Но это все теория. ПС. А вообще кончай прикалываться ;) Название: Re: Не получается подружиться с QVector Отправлено: ритт от Июль 09, 2009, 20:20 Так это сравнение указателей, а не объектов. Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 10, 2009, 09:59 Код
ну так это с указателем... QVector<A *> list; Это как бы не совсем решение, т.е. конечно решение, но уже с изменением условий самой задачи... Меня то интересует решение как раз когда QVector<A> list; если таковое есть... Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 10, 2009, 10:00 Извиняюсь за тупость но я так и не понял решения... :( вы имеете ввиду оператор присваивания? Как его написать для данного случая? еще раз извиняюсь) Честно говоря, когда игнорируют развернутые ответы дальнейшее желание писать пропадает, но на этот раз отвечую: "добавить * между A и >" Интересует решение без добавления * между А и >... Как бы так... Тут кто-то говорил про то что нужно особый конструктор написать, вот какой и где, вот что интересует Название: Re: Не получается подружиться с QVector Отправлено: f-r-o-s-t от Июль 10, 2009, 10:08 Ну хочешь так твое дело, просто объяви и определи конструктор копирования в классе B
B(const B &other); Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 10, 2009, 10:23 Ну хочешь так твое дело, просто объяви и определи конструктор копирования в классе B B(const B &other); Правильно я понимаю что это будет выглядеть так: Код: class B : public QObject В данной записи смущает что полей класса может быть дофига, и что все так прописывать? Если ничего не поделаешь, то ладно, но ведь вроде бы если рассматривать обычные классы, то когда экземпляры класса приравниваются происходит копирование полей? Название: Re: Не получается подружиться с QVector Отправлено: f-r-o-s-t от Июль 10, 2009, 10:35 Это конструктор копирования, он описывает как создать один объект на основе другого,
как бы вы писали оператор присваивания? ведь тоже пришлось определять все поля. Копирование полей происходит по умолчанию, но бывает что это не самый лучший вариант. Вообщем долго можно рассказывать, есть еще вопросы ? Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 10, 2009, 10:44 Это конструктор копирования, он описывает как создать один объект на основе другого, как бы вы писали оператор присваивания? ведь тоже пришлось определять все поля. Копирование полей происходит по умолчанию, но бывает что это не самый лучший вариант. Вообщем долго можно рассказывать, есть еще вопросы ? Сделал так: Код: class B : public QObject Так вот после того как я добавил ф-ю append(A val) в класс CMain вылезла ошибка: error C2558: class 'A' : no copy constructor available or copy constructor is declared 'explicit' while compiling class template member function 'void QVector<T>::append(const T &)' Как ее исправить? Название: Re: Не получается подружиться с QVector Отправлено: denka от Июль 10, 2009, 11:07 Блин ну ведь на двух придыдущих страницах разжевывали несколько раз уже. Классы от QObject не копируется!!! Не ужели не понятно? А ты что делаешь?
Код: A(A&a) : val1(a.val1), val2(a.val2){} Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 10, 2009, 11:16 Блин ну ведь на двух придыдущих страницах разжевывали несколько раз уже. Классы от QObject не копируется!!! Не ужели не понятно? А ты что делаешь? Код: A(A&a) : val1(a.val1), val2(a.val2){} Там писали что нужно использовать копирующий конструктор, я вроде как его и сделал: B(B&){}, так что мешает его вызвать? Про указатель уже писал выше, что не желательно. Название: Re: Не получается подружиться с QVector Отправлено: spectre71 от Июль 10, 2009, 11:27 Код
Название: Re: Не получается подружиться с QVector Отправлено: spectre71 от Июль 10, 2009, 11:42 А так еще лучше:
Код
Название: Re: Не получается подружиться с QVector Отправлено: dr_Begemot от Июль 10, 2009, 11:47 А так еще лучше: Код
Спасибо большое, сейчас попробую) а что делает explicit? Название: Re: Не получается подружиться с QVector Отправлено: spectre71 от Июль 10, 2009, 11:58 а что делает explicit? Если просто, то запрещает неявное преобразование типа к В.Название: Re: Не получается подружиться с QVector Отправлено: ритт от Июль 10, 2009, 16:30 нахрена вообще твой B на основе QObject?
Название: Re: Не получается подружиться с QVector Отправлено: spectre71 от Июль 10, 2009, 16:42 нахрена вообще твой B на основе QObject? Это не мой :(Так задачу поставили - выше... Название: Re: Не получается подружиться с QVector Отправлено: ритт от Июль 10, 2009, 17:51 нахрена вообще твой B на основе QObject? Это не мой :(Так задачу поставили - выше... dr_Begemot: ^^ Название: Re: Не получается подружиться с QVector Отправлено: spectre71 от Июль 10, 2009, 18:29 нахрена вообще твой B на основе QObject? Да, кстати, "dr_Begemot", зачем? Какая задача? Опиши! Название: Re: Не получается подружиться с QVector Отправлено: pastor от Июль 10, 2009, 22:41 Это как бы не совсем решение, т.е. конечно решение, но уже с изменением условий самой задачи... Меня то интересует решение как раз когда QVector<A> list; если таковое есть... Блин, а кто это условие задавал? В использовании указателя есть что-то дурное? Непойму, зачем из-за мелочи городить огород Название: Re: Не получается подружиться с QVector Отправлено: spectre71 от Июль 10, 2009, 22:56 Блин, а кто это условие задавал? В использовании указателя есть что-то дурное? Непойму, зачем из-за мелочи городить огород Ну хочется ему, может где-то удобнее: QVector<A> list; А, чем мое решение не нравиться? Название: Re: Не получается подружиться с QVector Отправлено: pastor от Июль 10, 2009, 22:57 А, чем мое решение не нравиться? А я где-то сказал что не нравится? ;) Я просто смысла непойму, заради чего? Поэтому я считаю этот разговор не конструктивным. Без разъяснений автора можно гадать долго :) Может и QObject как базовый класс ненужен ) Название: Re: Не получается подружиться с QVector Отправлено: spectre71 от Июль 10, 2009, 23:33 А я где-то сказал что не нравится? ;) Я просто смысла непойму, заради чего? Поэтому я считаю этот разговор не конструктивным Может напишет, зачем. Я тоже не не могу себе представить для какой задачи это может понадобиться. ??? |