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

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

Восстановить пароль Регистрация
 
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
27.10.2011, 21:34     Проблема.(Не знаю даже как ее назвать...) #1
Небольшое введение, кто не хочет может сразу перейти ко второй части.
У меня есть проблема с написанием части моей программы. Все дошло до того, что у меня есть две переменные, а точнне указатели на них и тип у этих указателей 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!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2011, 21:34     Проблема.(Не знаю даже как ее назвать...)
Посмотрите здесь:

посмотрите, пожалуйста, а то я даже не знаю как за нее взяться....( C++
C++ Как назвать эту строку?
C++ Как назвать файл переменной n?
C++ Не знаю как назвать
Как назвать классы? C++
даже не знаю как опить в заголовки C++
C++ Как назвать элемент масива структур
C++ Как назвать транслятор языка PL/0

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Charles Kludge
Клюг
 Аватар для Charles Kludge
7621 / 3136 / 361
Регистрация: 03.05.2011
Сообщений: 8,383
30.10.2011, 01:10     Проблема.(Не знаю даже как ее назвать...) #2
C
1
2
3
4
5
6
union TYPE_ID{
float f;
long  l;
int   i;
char  *c;
};
darkknight2008
 Аватар для darkknight2008
61 / 61 / 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 и т.п.
Yandex
Объявления
31.10.2011, 00:03     Проблема.(Не знаю даже как ее назвать...)
Ответ Создать тему
Опции темы

Текущее время: 04:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru