Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
darkknight2008
62 / 62 / 6
Регистрация: 16.10.2011
Сообщений: 200
#1

Проблема.(Не знаю даже как ее назвать...) - C++

27.10.2011, 21:34. Просмотров 429. Ответов 2
Метки нет (Все метки)

Небольшое введение, кто не хочет может сразу перейти ко второй части.
У меня есть проблема с написанием части моей программы. Все дошло до того, что у меня есть две переменные, а точнне указатели на них и тип у этих указателей void *. Также у меня есть идентификатор типа переменной. В итоге получается нечто такое: В программе есть enum TYPEID {TYPE_INT = 1, TYPE_FLOAT = 2, TYPE_CHAR = 3, TYPE_VECTOR = 4 и т.д.}. Значит я имею два указателя на переменные: void *a1; void *a2; Также у меня имеются две переменные, которые хранят идентификаторы типа переменной, на которые указывают оба указателя: TYPEID Ta1; TYPEID Ta2; Итак, главная задача! Как мне присвоить в переменную a1 значение переменной a2 с учетом их типов???
Т.е. если Ta1 == TYPE_INT и Ta2 == TYPE_FLOAT, то должно произойти что-то типа такого: *(int *)a1 = *(float *)a2, ну или тому подобному... Проблему модно было бы решить при помощи перебора усроить перебор каждого варианта: if (Ta1 == TYPE_INT && Ta2 == TYPE_CHAR) *(int *)a1 = *(char *)a2; Но еще придется тогда отбрасывать некоторые варианты, ведь в переменную типа int нельзя будет присвоить переменную типа vector и т.п. Вот я и прошу помощи, как это все можно упростить, ведь код получается ОЧЕНЬ громоздким и себя не оправдывает.
Тот же вопрос, но по другому : Раскажу о том, как дошел до всего этого. Мне потребовался класс который будет хранить в себе переменную, тип которой задан идентификатором, получилось нечто такое:
C++
1
2
3
4
5
6
7
8
9
10
11
 
class VTYPE
{
private:
  TYPEID Tid;
  void *Var;
public:
  explicit VTYPE( TYPEID Tid );
  ~VTYPE( VOID );
  template<class TYPE> VTYPE & operator = ( TYPE V );
};
В конструкторе в качестве аргумента мы получаем тип переменной, далее выделяем под нее память.
Основная проблема заключается в перегрузке оператора =. Я нечто набросал, в итоге в содержимом функции получилось нечто на подобии этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
switch (Tid)
{
case TYPE_INT:
  *(INT *)Var = V;
  break;
case TYPE_FLOAT:
  *(float *)Var = V;
  break;
case TYPE_VECTOR:
  *(vector *)Var = V;
  break;
}
return *this;
На первый взгляд все бы ничего, но рассмотрим пример:
C++
1
2
3
4
VTYPE T(TYPE_INT); // создаем переменную под тип int
vector V(1,2,3); // заводим вектор с координатами 1, 2, 3
// Выполняем действие
T = V;
У нас по идее вызовется наш перегруженный оператор для типа vector. На этого не произойдет, потому что ошибка появится уже на момент компиляции. Он укажет что операция *(int *)Var = V; невозможна, ведь у нас несовместимость типов. Ну вот я и прошу помощи справиться с моим недугом. Возможно это можно сделать совсем по другому, или обрабатывать какие-либо исключения, короче HELP ME, PLEASE!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2011, 21:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема.(Не знаю даже как ее назвать...) (C++):

Не знаю как назвать - C++
Подскажите пожалуйста, где здесь ошибка? Пытался скомпилировать в Microsoft Visual C++ (2010) Нажал на кнопку Run, а там ошибка, ну...

даже не знаю как опить в заголовки - C++
есть пастеризационная установка l001 со скоростью 10 000 л в час. Надо чтобы в label1 показывала время когда начинать постеризацию...

посмотрите, пожалуйста, а то я даже не знаю как за нее взяться....( - C++
Постановка задачи: Разработать программу, выполняющую следующие функции: • ввод одномерного массива из n целых чисел (1&lt;=n&lt;=100); ...

Как назвать классы? - C++
Сразу замечу, что дело происходит в 2D без физики, как таковой. 1) У меня есть классы: Mixer - звуковой движок Graphics -...

Как назвать эту строку? - C++
do { cin&gt;&gt;x; summ+=a; f=x!=0; } while (f); Первая - заголовок. Вторая, третья, четвёртая, пятая и шестая вместе - тело. А...

Как назвать транслятор языка PL/0 - C++
Привет. В книге Вирта (Алгоритмы + структуры данных = программы) в конце разрабатывается Транслятор языка PL/0. Я решил его реализовать....

2
Charles Kludge
Клюг
7631 / 3146 / 363
Регистрация: 03.05.2011
Сообщений: 8,382
30.10.2011, 01:10 #2
C
1
2
3
4
5
6
union TYPE_ID{
float f;
long  l;
int   i;
char  *c;
};
0
darkknight2008
62 / 62 / 6
Регистрация: 16.10.2011
Сообщений: 200
31.10.2011, 00:03  [ТС] #3
Цитата Сообщение от Charles Kludge Посмотреть сообщение
C
1
2
3
4
5
6
union TYPE_ID{
float f;
long  l;
int   i;
char  *c;
};
Спасибо, пробовал, но указать тип это не помогает, ведь для нужного мне действия нужно явно указать тип, а для данного примера мне нужно будет при помощи числа типа INT указать, использую я или float f или long l и т.п.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2011, 00:03
Привет! Вот еще темы с ответами:

Как назвать файл переменной n? - C++
Господа, помогите новичку, я пишу программу и я хочу, чтобы она создавала файл, названной по имени переменной n, которую я ввожу чуть-чуть...

Как назвать элемент масива структур - C++
Есть вот такая вот часть кода: player players = { {&quot;ukraine&quot;, &quot;pl&quot;, &quot;loshkov_genadi_yurivich&quot;, 2, 19, 186, 81}, {&quot;russia&quot;, ...

Как назвать переменную зная её String - C++
Например есть у нас массив из трех стрингов. {a b c}. Я такой считываю и хочу что бы первый символ &quot;в данном случае а&quot; обозвал новую...

Что это? Как правильно назвать? - C++
const int T_height = 36; const int T_width = 2; const std::string Table = { { &quot;a&quot;,&quot;letter&quot; }, { &quot;b&quot;,&quot;letter&quot; }, { &quot;c&quot;,&quot;letter&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru