Russian Qt Forum

Qt => Вопросы новичков => Тема начата: slava_d200 от Октябрь 12, 2012, 22:58



Название: какой тип переменной надо использовать.
Отправлено: slava_d200 от Октябрь 12, 2012, 22:58
какой тип переменной надо использовать чтобы
переменная могла принимать адрес QString, int и т.д.

Пробывал QVariant - это вроде не тот вариант


Название: Re: какой тип переменной надо использовать.
Отправлено: kambala от Октябрь 12, 2012, 23:29
QVariant принимает значения, а не адреса. если адрес, то можно попробовать через void *


Название: Re: какой тип переменной надо использовать.
Отправлено: slava_d200 от Октябрь 12, 2012, 23:39
QVariant принимает значения, а не адреса. если адрес, то можно попробовать через void *


и есть ли возможность в данном варианте определить на какой тип ссылается эта ссылка ?


Название: Re: какой тип переменной надо использовать.
Отправлено: navrocky от Октябрь 12, 2012, 23:49
По void* никакой информации узнать нельзя.

Код
C++ (Qt)
void* ptr = 0;
QString* s = reinterpret_cast<QString*>(ptr);
 


Название: Re: какой тип переменной надо использовать.
Отправлено: slava_d200 от Октябрь 12, 2012, 23:53
понял
СПАСИБО.


Название: Re: какой тип переменной надо использовать.
Отправлено: navrocky от Октябрь 13, 2012, 00:03
Большинство кутэшных классов шарят свое тело. Поэтому я бы всё-таки использовал QVariant и передавал по значению.


Название: Re: какой тип переменной надо использовать.
Отправлено: kambala от Октябрь 13, 2012, 03:13
можно попробовать что-то такое если нужны именно указатели:
Код
C++ (Qt)
enum VariableType
{
   Int,
   Long,
   String,
   ...
};
 
struct VariableData
{
   VariableType type;
   void *data;
};
ну и дальше через свич раскручивать


Название: Re: какой тип переменной надо использовать.
Отправлено: Igors от Октябрь 13, 2012, 09:49
Или без reinterpret
Код
C++ (Qt)
struct CVarPtr
{
   int mTypeID;
   union {
     int * mInt;
     QString * mStr;
   };
};
 


Название: Re: какой тип переменной надо использовать.
Отправлено: andrew.k от Октябрь 13, 2012, 18:39
Или без reinterpret
Код
C++ (Qt)
struct CVarPtr
{
   int mTypeID;
   union {
     int * mInt;
     QString * mStr;
   };
};
 
Эта конструкция называется "обмани всех и себя в том числе")


Название: Re: какой тип переменной надо использовать.
Отправлено: Igors от Октябрь 13, 2012, 19:24
Эта конструкция называется "обмани всех и себя в том числе")
Откуда такая разрушительная критика? :) union просто "не в моде" - но это прекрасная штатная конструкция


Название: Re: какой тип переменной надо использовать.
Отправлено: andrew.k от Октябрь 13, 2012, 20:07
Эта конструкция называется "обмани всех и себя в том числе")
Откуда такая разрушительная критика? :) union просто "не в моде" - но это прекрасная штатная конструкция
У union совершенно другое назначение, не для "безболезненного" приведения указателей.
"прекрасная" это очень громко сказано.
Эта конструкция примерно уровня goto - использовать можно, но крайне редко и уж точно не с указателями.
А да. Ответ на вопрос "откуда критика": это мое имхо.


Название: Re: какой тип переменной надо использовать.
Отправлено: Igors от Октябрь 13, 2012, 20:37
У union совершенно другое назначение, не для "безболезненного" приведения указателей.
"прекрасная" это очень громко сказано.
Эта конструкция примерно уровня goto - использовать можно, но крайне редко и уж точно не с указателями.
А да. Ответ на вопрос "откуда критика": это мое имхо.
А не предвзято ли это имхо? Ну вот хотя бы данный случай - чем union плох? Я так вижу что он ничем не хуже, а наоборот, лучше того reinterpret_cast, который здесь придется писать ой много раз. Или плюсовый каст - это типа "показатель крутизны"? Ну из этих "коротких штанишек" наверное все уже повырастали :) Обоснуйте Ваше мнение, приведите пример(ы) - а пока видны только довольно категорические утверждения, основанные непонятно на чем.


Название: Re: какой тип переменной надо использовать.
Отправлено: andrew.k от Октябрь 13, 2012, 21:15
У union совершенно другое назначение, не для "безболезненного" приведения указателей.
"прекрасная" это очень громко сказано.
Эта конструкция примерно уровня goto - использовать можно, но крайне редко и уж точно не с указателями.
А да. Ответ на вопрос "откуда критика": это мое имхо.
А не предвзято ли это имхо? Ну вот хотя бы данный случай - чем union плох? Я так вижу что он ничем не хуже, а наоборот, лучше того reinterpret_cast, который здесь придется писать ой много раз. Или плюсовый каст - это типа "показатель крутизны"? Ну из этих "коротких штанишек" наверное все уже повырастали :) Обоснуйте Ваше мнение, приведите пример(ы) - а пока видны только довольно категорические утверждения, основанные непонятно на чем.
По поводу reinterpret_cast уже была отдельная тема. Зачем повторяться?
Union с указателями это синтаксический обман. Фактически это сишное приведение типа. При том, что синтаксически его даже нет.
Union нужно использовать для данных, а не для указателей.