Russian Qt Forum

Qt => Общие вопросы => Тема начата: vipet от Март 28, 2009, 09:19



Название: Простой вопрос по QVariant
Отправлено: vipet от Март 28, 2009, 09:19

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

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


Название: Re: Простой вопрос по QVariant
Отправлено: Rcus от Март 28, 2009, 09:29
Неправильно, не удалится.


Название: Re: Простой вопрос по QVariant
Отправлено: vipet от Март 28, 2009, 12:20
А как делать правильно?


Название: Re: Простой вопрос по QVariant
Отправлено: gueRRero от Март 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));

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


Название: Re: Простой вопрос по QVariant
Отправлено: Rcus от Март 28, 2009, 15:00
Ну если именно QColor хранить то
QVariant v = QColor(a,r,g,b);
и все, никаких delete, а для извлечения значения -
QColor c = v.value<QColor>();
или qVariantValue.
собственно я только что пересказал один из абзацев документации по QVariant duh.


Название: Re: Простой вопрос по QVariant
Отправлено: vipet от Март 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;

т.к. создание и удаление будет в разных функциях


Название: Re: Простой вопрос по QVariant
Отправлено: Rcus от Март 28, 2009, 18:19
да нигде там не нужен new и delete. Все тоже самое что и с QColor, только для классов из QtCore есть простые функции для преобразования, типа toString().


Название: Re: Простой вопрос по QVariant
Отправлено: gueRRero от Март 28, 2009, 19:23
P.S. guajiro, почему отредактировал пост, убрав "delete &v"? Как тогда правильно освобождать память в этом случае?
Код:
QVariant v = *(QColor::QColor(0,0,0,0));
Нету new, т.е. память не отбирается у операционной системы, а значит и возвращать ей ничего не нужно (т.е. не нужен и delete). Я сам на такую штуку попадался.


Название: Re: Простой вопрос по QVariant
Отправлено: Alex Custov от Март 28, 2009, 20:43

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

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

если я правильно помню, такое удаление - undefined behaviour, и в любом случае так делать нельзя в независимости от QVariant или других классов.


Название: Re: Простой вопрос по QVariant
Отправлено: BRE от Март 28, 2009, 20:55
Код:
QVariant v = *(QColor::QColor(0,0,0,0));
Смотрю я на этот код и думаю, а каким компилятором этот код соберается и что делает?


Название: Re: Простой вопрос по QVariant
Отправлено: vipet от Март 29, 2009, 05:49
Код:
QVariant v = *(QColor::QColor(0,0,0,0));
Смотрю я на этот код и думаю, а каким компилятором этот код соберается и что делает?


Да, MS VS выдает на этот код ошибку "error C2100: illegal indirection"


Название: Re: Простой вопрос по QVariant
Отправлено: gueRRero от Март 29, 2009, 10:49
Ну да, правильно. Там ведь нет указателя, а значит и разыменовывать нечего.
Вот так компилятор ругаться не будет:
Код:
QVariant v = QColor::QColor(0,0,0,0)


Название: Re: Простой вопрос по QVariant
Отправлено: BRE от Март 29, 2009, 18:14
Ну да, правильно. Там ведь нет указателя, а значит и разыменовывать нечего.
Вот так компилятор ругаться не будет:
Код:
QVariant v = QColor::QColor(0,0,0,0)
Так проще будет:  ;)
Код
C++ (Qt)
QVariant v = QColor(0,0,0,0);