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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Простой вопрос по QVariant  (Прочитано 6677 раз)
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« : Март 28, 2009, 09:19 »


Если я храню в QVariant'e объект, то правильно ли он удалится, если я делаю так:

Код:
QVariant v = *(new QColor(0,0,0,0));
...
delete &v;
Записан
Rcus
Гость
« Ответ #1 : Март 28, 2009, 09:29 »

Неправильно, не удалится.
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #2 : Март 28, 2009, 12:20 »

А как делать правильно?
Записан
gueRRero
Гость
« Ответ #3 : Март 28, 2009, 14:05 »

Думаю, что правильнее будет:

Код:
QColor *color = new QColor(0,0,0,0);
QVariant v = *(color);
...
delete color;

А если не хочется нагромождать, то можно так:

Код:
QVariant v = *(QColor::QColor(0,0,0,0));

Так даже, наверное, будет лучше...
« Последнее редактирование: Март 28, 2009, 17:13 от guajiro » Записан
Rcus
Гость
« Ответ #4 : Март 28, 2009, 15:00 »

Ну если именно QColor хранить то
QVariant v = QColor(a,r,g,b);
и все, никаких delete, а для извлечения значения -
QColor c = v.value<QColor>();
или qVariantValue.
собственно я только что пересказал один из абзацев документации по QVariant duh.
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #5 : Март 28, 2009, 18:01 »

Rcus, спасибо, но надо не только QColor, а почти всё остальное тоже. Со всеми остальными QVariant-совместимыми классами так же нельзя ведь работать

А если не хочется нагромождать, то можно так:

Код:
QVariant v = *(QColor::QColor(0,0,0,0));
...
delete &v

Так даже, наверное, будет лучше...

Это любой с++ объект можно так создавать что ли, вызывая конструктор через Class::Class(...)? Или это не конструктор? (Не знаю некоторых тонкостей с++)

P.S. guajiro, почему отредактировал пост, убрав "delete &v"? Как тогда правильно освобождать память в этом случае?

Нагромождать не хочется, равно как и хранить разные поинтеры в случае
Код:
QColor *c = new QVariantCompatibleClass(...);
QVariant v = *c;
...
delete c;

т.к. создание и удаление будет в разных функциях
« Последнее редактирование: Март 28, 2009, 18:04 от vipet » Записан
Rcus
Гость
« Ответ #6 : Март 28, 2009, 18:19 »

да нигде там не нужен new и delete. Все тоже самое что и с QColor, только для классов из QtCore есть простые функции для преобразования, типа toString().
Записан
gueRRero
Гость
« Ответ #7 : Март 28, 2009, 19:23 »

P.S. guajiro, почему отредактировал пост, убрав "delete &v"? Как тогда правильно освобождать память в этом случае?
Код:
QVariant v = *(QColor::QColor(0,0,0,0));
Нету new, т.е. память не отбирается у операционной системы, а значит и возвращать ей ничего не нужно (т.е. не нужен и delete). Я сам на такую штуку попадался.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #8 : Март 28, 2009, 20:43 »


Если я храню в QVariant'e объект, то правильно ли он удалится, если я делаю так:

Код:
QVariant v = *(new QColor(0,0,0,0));
...
delete &v;

если я правильно помню, такое удаление - undefined behaviour, и в любом случае так делать нельзя в независимости от QVariant или других классов.
Записан
BRE
Гость
« Ответ #9 : Март 28, 2009, 20:55 »

Код:
QVariant v = *(QColor::QColor(0,0,0,0));
Смотрю я на этот код и думаю, а каким компилятором этот код соберается и что делает?
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #10 : Март 29, 2009, 05:49 »

Код:
QVariant v = *(QColor::QColor(0,0,0,0));
Смотрю я на этот код и думаю, а каким компилятором этот код соберается и что делает?


Да, MS VS выдает на этот код ошибку "error C2100: illegal indirection"
Записан
gueRRero
Гость
« Ответ #11 : Март 29, 2009, 10:49 »

Ну да, правильно. Там ведь нет указателя, а значит и разыменовывать нечего.
Вот так компилятор ругаться не будет:
Код:
QVariant v = QColor::QColor(0,0,0,0)
Записан
BRE
Гость
« Ответ #12 : Март 29, 2009, 18:14 »

Ну да, правильно. Там ведь нет указателя, а значит и разыменовывать нечего.
Вот так компилятор ругаться не будет:
Код:
QVariant v = QColor::QColor(0,0,0,0)
Так проще будет:  Подмигивающий
Код
C++ (Qt)
QVariant v = QColor(0,0,0,0);
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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