LINUX.ORG.RU

динамическое создание переменной


0

0

Возможно ли так, чтобы налету, в зависимости от каких-то условий я создавал переменную одного или другого типа ?

VARIANT не катит, потому что в месте использования переменная должна быть вполне типизована.


Ответ на: комментарий от kosmonavt

Да, простите, что не указал. Это - C++, работаю с wxWidgets.

Я в курсе, что есть wxPython, а всем скриптовым (интерпретируемым) языкам это под силу (наверное).

Может быть через wxPython или есть "чистое" решение на C++ ?

gtyrin
() автор топика
Ответ на: комментарий от gtyrin

>или есть "чистое" решение на C++ ?

тебе нужно RTTI

хотя скорее всего у wxWidgets есть свой аналог заточеный под wxWidgets.

cvv ★★★★★
()
Ответ на: комментарий от gtyrin

На C++ тривиальное решение.

class Dynamic {
public:
  virtual ~Dynamic(){}
};

class A {
....
};

class B {
...
};

............

class DynamicA:public A, public Dynamic {
........
};


class DynamicA:public A, public Dynamic {
........
};
..............
Dynamic *ptr;
if(условие1) ptr = new DynamicA;
else if(условие2) ptr = new DynamicB;

...........
try {
   A& a = dynamic_cast<DynamicA&>(*ptr);
   B& b = dynamic_cast<DynamicB&>(*ptr);
}catch(bad_cast&){
  ...
}

kosmonavt
()
Ответ на: комментарий от kosmonavt

Спасибо, примерно ясно.

Также как и то, что придется писать классы-обертки для простых типов данных, тоже необходимых.

gtyrin
() автор топика
Ответ на: комментарий от gtyrin

А чем не нравится и в самом деле в "зависимости от каких-то условий создавать переменную одного или другого типа"?? Создатель кода - _Ты_, а не тот язык программирования который используешь.

Я бы посоветовал упростить концепцию, ато вряд ли получится хороший, читабельный код.

KIV
()
Ответ на: комментарий от gtyrin

>придется писать классы-обертки

Ну если для простых - тут может быть куча решений.

Например по предыдущему варианту:
===========================================================
class Dynamic {
public:
  virtual ~Dynamic(){}
};

template<class T>
struct SimpleType: public Dynamic {
   ...
   SimpleType(const T& t):value(t){}
   T value;
    ...
};

SimpleType<int> *pint = new SimpleType<int>(100);
SimpleType<double> *pdouble = new SimpleType<double>(10.1);
===========================================================
В принципе сойдет и для сложных

А вообще КIV прав. Я после того как с никсами связался, 
на плюсах стал редко писать. Хороших инструментов - навалом.

kosmonavt
()
Ответ на: комментарий от KIV

>Я бы посоветовал упростить концепцию, ато вряд ли получится хороший, читабельный код

Ну сейчас ему такие советы рано давать. Судя по вопросу, он язык плохо знает и опыта мало. Когда набьет руку, тогда и сам концепциями мыслить будет.

kosmonavt
()
Ответ на: комментарий от kosmonavt

Из предпоследнего примера было ясно, как реализовывать переменные общего родственного типа (Dynamic). А как для последнего примера задать одну переменную и использовать для создания объекта разные шаблоны ?

gtyrin
() автор топика
Ответ на: комментарий от gtyrin

Dynamic *ptr = new SimpleType<int>(100);
......
......
SimpleType<int> *pint = new dynamic_cast<SimpleType<int>*>(ptr);
if(pint!=0){
  .....
}

или с исключением

try {
   SimpleType<int> &var = new dynamic_cast<SimpleType<int>&>(*ptr);

}catch(bad_cast&){
}

======================================================
А не почитать ли вам учебник по плюсам ?

kosmonavt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.