Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
darkknight2008
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
1

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

27.10.2011, 21:34. Просмотров 491. Ответов 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
Ответы с готовыми решениями:

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

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

Получение всех возможных способов получения числа сложением(не знаю как правильно это назвать, зайдите и посмотрите)
У меня задание написать программу которая будет выписывать все возможные способы получить число N. ...

посмотрите, пожалуйста, а то я даже не знаю как за нее взяться....(
Постановка задачи: Разработать программу, выполняющую следующие функции: • ввод одномерного...

Даже не знаю как назвать:)
Здраствуйте уважаемые форумчане собствено назрел такой вопрос. private void...

2
Charles Kludge
Клюг
7647 / 3162 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
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 / 11
Регистрация: 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

Даже не знаю как назвать )
Тype Person =Record Name: string; age: 1..200 end; list= file of person; Процедура Youngest (var...

Даже не знаю как назвать тему, но тут есть девушки
Вообщем ваяю сайт знакомств. Шаблон Lovestory Есть страница поиска анкет и анкеты выводятся...

Даже не знаю в чем проблема.
Привет всем. Перейду сразу к делу. В задней панели были подрублены колонки. Ну в передней...


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

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

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