Название: Простой вопрос по QVariant Отправлено: vipet от Март 28, 2009, 09:19 Если я храню в QVariant'e объект, то правильно ли он удалится, если я делаю так: Код: QVariant v = *(new QColor(0,0,0,0)); Название: 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 = *(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)); Так даже, наверное, будет лучше... Это любой с++ объект можно так создавать что ли, вызывая конструктор через Class::Class(...)? Или это не конструктор? (Не знаю некоторых тонкостей с++) P.S. guajiro, почему отредактировал пост, убрав "delete &v"? Как тогда правильно освобождать память в этом случае? Нагромождать не хочется, равно как и хранить разные поинтеры в случае Код: QColor *c = new QVariantCompatibleClass(...); т.к. создание и удаление будет в разных функциях Название: 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)); Название: Re: Простой вопрос по QVariant Отправлено: Alex Custov от Март 28, 2009, 20:43 Если я храню в QVariant'e объект, то правильно ли он удалится, если я делаю так: Код: QVariant v = *(new QColor(0,0,0,0)); если я правильно помню, такое удаление - 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) Код
|