Russian Qt Forum
Ноябрь 26, 2024, 02:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Не получается подружиться с QVector  (Прочитано 27341 раз)
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
{
  Q_OBJECT
  B(QObject *parent=0);
  //...
};

class A{
  //...
  B val;
  //...
};

Я так понимаю, что нужно добавлять не сам класс B а определенным образом описанный класс BItem, но каким образом его описывать я не нашел... С другой стороны ведь QString спокойно добавляется в QVector...
Подскажите плиз или киньте прямые линки.

Спасибо.

p.s. Если во 2м случае из main QVector<A> list;то все ок.
« Последнее редактирование: Июль 09, 2009, 16:08 от dr_Begemot » Записан
Rcus
Гость
« Ответ #1 : Июль 09, 2009, 16:10 »

И вы надеетесь что компилятор сможет создать конструктор копирования для класса содержащего некопируемые объекты?
Записан
dr_Begemot
Гость
« Ответ #2 : Июль 09, 2009, 16:12 »

И вы надеетесь что компилятор сможет создать конструктор копирования для класса содержащего некопируемые объекты?

Так что надо сделать?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Июль 09, 2009, 16:12 »

определить конструктор копирования видимо
Записан
dr_Begemot
Гость
« Ответ #4 : Июль 09, 2009, 16:15 »

определить конструктор копирования видимо

Я не совсем понимаю...
Почему объекты порожденные от QObject - некопируемые?
Не могли бы вы написать как именно должен выглядеть конструктор копирования в данном случае?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Июль 09, 2009, 16:17 »

Конструктор копирования ненужен. Делай так:

Код
C++ (Qt)
class B : public QObject
{
 Q_OBJECT
 B(QObject *parent=0);
 //...
};
 
 
QVector<B *> list;
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Июль 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
« Последнее редактирование: Июль 09, 2009, 16:22 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
dr_Begemot
Гость
« Ответ #7 : Июль 09, 2009, 16:22 »

Конструктор копирования ненужен. Делай так:

Код
C++ (Qt)
class B : public QObject
{
 Q_OBJECT
 B(QObject *parent=0);
 //...
};
 
 
QVector<B *> list;

нужно чтобы в классе A было два поля типа B, а вектор содержал бы значения типа А....
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Июль 09, 2009, 16:24 »

pastor типа "мы не смогли договориться как сравнивать QObject'ы и потому запретили это делать нафиг"?
Записан
Rcus
Гость
« Ответ #9 : Июль 09, 2009, 16:24 »

Я не совсем понимаю...
Почему объекты порожденные от QObject - некопируемые?
Не могли бы вы написать как именно должен выглядеть конструктор копирования в данном случае?
Для полиморфных объектов сама операция копирования не имеет смысла(не только наследников QObject, но вообще), возможно только клонирование объекта, но и оно не всегда работает (как например клонировать сокет, файл, виджет?) поэтому нужно понять какая вам нужна семантика при копировании объекта класса A, а затем реализовать ее в конструкторе копирования.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Июль 09, 2009, 16:31 »

pastor типа "мы не смогли договориться как сравнивать QObject'ы и потому запретили это делать нафиг"?

Пояснение этого приводится в ассистанте в описание Qt Object Model
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
dr_Begemot
Гость
« Ответ #11 : Июль 09, 2009, 16:33 »

pastor типа "мы не смогли договориться как сравнивать QObject'ы и потому запретили это делать нафиг"?

Пояснение этого приводится в ассистанте в описание Qt Object Model

Так нужен ли конструктор копирования или как-то подругому можно сделать?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #12 : Июль 09, 2009, 16:36 »

pastor типа "мы не смогли договориться как сравнивать QObject'ы и потому запретили это делать нафиг"?

Пояснение этого приводится в ассистанте в описание Qt Object Model
я охотно верю, что они это еще и красиво обосновали... все равно тупо
Записан
BRE
Гость
« Ответ #13 : Июль 09, 2009, 16:47 »

я охотно верю, что они это еще и красиво обосновали... все равно тупо
А как можно сравнивать QObject, а как можно сравнивать его наследников?
Как можно сравнить QListView и QFtp? Кто больше? Улыбающийся
Записан
dr_Begemot
Гость
« Ответ #14 : Июль 09, 2009, 16:55 »

я охотно верю, что они это еще и красиво обосновали... все равно тупо
А как можно сравнивать QObject, а как можно сравнивать его наследников?
Как можно сравнить QListView и QFtp? Кто больше? Улыбающийся


Причем тут сравнивание? Речь идет просто о том почему базовые классы в QVector нормально работают, а порожденные от QOobject нет...
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 23.