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

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

Войти
Регистрация
Восстановить пароль
 
rotciv
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
#1

Можно ли "подменить" тип данных в процессе выполнения? - C++

24.07.2015, 16:40. Просмотров 280. Ответов 5
Метки нет (Все метки)

Добрый день!

Есть у меня такой кусок кода, описывающего класс.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef vector<double> complex;
typedef map<string, double> datablock;
typedef map<string, complex> acdatablock;
 
class PsfFileReader {
public:
  PsfFileReader(string S1);
  datablock getDataBlock();
...
  ifstream File;
 
private:
  datablock readDataBlock();
  string FileName;
...
  datablock DataBlock;
  bool DbEmpty;
  datablock prevDataBlock;
  bool PrevDbEmpty;
  bool ReadFile;
}; // PsfFileReader
Определено 2 типа: datablock и acdatablock.
Какой из 2-х типов будет использоваться, становится известно только в момент работы конструктора.
Разница между datablock и acdatablock - в том, что первый содержит действительные числа (double), а второй - комплексные (как известно, для комплексного числа нужна пара double). Я решил класть эту пару в вектор.

Вопрос - надо ли класть рядом acdatablock и писать второй комплект функций-членов, с ним работающих, или можно делать подмену по ходу дела, с помощью шаблонов, например?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2015, 16:40     Можно ли "подменить" тип данных в процессе выполнения?
Посмотрите здесь:

Тип данных "Anketa" - не получается ввести пол - C++
когда запускается программа в первом пункте, не получается ввести пол не подскажите в чем проблема? #include &lt;iostream&gt; #include...

Для чего функции поместили в "тип данных"? - C++
Вопрос про функции. Для чего функции поместили в &quot;тип данных&quot;?

Определить тип данных "множество целых чисел" - C++
Доброго времени суток, есть несколько задачек, не могу с ними справиться :( Может кто-нибудь сможет... Заранее огромное спасибо! ...

Объяснить термин "абстрактный тип данных" - C++
Почему именно он абстрактный? Не зависит от типа входных параметров, а еще от чего?

Абстрактный тип данных "Собака" - C++
Доброго времени суток. Я - студент политеха по специальности микроэлектроника и нанотехнологии. нам поставили программирование на с++, до...

Абстрактный тип данных "СПИСОК" - C++
Помогите с лабораторной на С++, пожалуйста:wall: В расписании сохраняется информация о движении поездов по станции...

Можно ли добавить "уточнение" данных - C++
Я только начала изучать С++. Изучаю по Страуструпу. Там есть решение задачи, переводящей дюймы в сантиметры, ли наоборот. Хотела узнать,...

Warning C4244: инициализация: преобразование "__int64" в "int", возможна потеря данных - C++
Что за предупреждение вылезает? Как исправить? (16 строка): warning C4244: инициализация: преобразование &quot;__int64&quot; в &quot;int&quot;, возможна...

Ошибка преобразование "time_t" в "unsigned int", возможна потеря данных - C++
Добрый день,по условию задачи: &quot;найти сумму элементов,расположенных на главной и побочной диагонали квадратной матрицы&quot; у меня вышла вот...

warning C4244: =: преобразование "double" в "float", возможна потеря данных - C++
Вот код. Работало, теперь не работает. Не пойму в чём дело. #include&lt;iostream&gt; #include&lt;stdlib.h&gt; #include&lt;time.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
889 / 628 / 126
Регистрация: 28.07.2012
Сообщений: 1,697
24.07.2015, 16:50     Можно ли "подменить" тип данных в процессе выполнения? #2
Цитата Сообщение от rotciv Посмотреть сообщение
Какой из 2-х типов будет использоваться, становится известно только в момент работы конструктора.
Действительные числа - это частный случай комплекстных.
Цитата Сообщение от rotciv Посмотреть сообщение
как известно, для комплексного числа нужна пара double
Для пары используй
Код
std::pair
или собственную структуру с двумя переменными.

А вообще, думаю тут все можно красиво разрешить с использованием шаблонов (template) и перегрузкой операторов.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
24.07.2015, 16:51     Можно ли "подменить" тип данных в процессе выполнения? #3
А не проще ли везде пользоваться классом map<string, complex> ведь double конвертируем в complex.
rotciv
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
24.07.2015, 17:35  [ТС]     Можно ли "подменить" тип данных в процессе выполнения? #4
Цитата Сообщение от Ilot Посмотреть сообщение
А не проще ли везде пользоваться классом map<string, complex> ведь double конвертируем в complex.
Да, действительно. Можно использовать std::complex и свой тип с векторами не городить.
Возможно, я потеряю в эффективности, если везде свои double заменю на complex.
То есть, вы предлагаете вместо double иметь (real, 0) и тогда у меня будет комплексная арифметика, которая даст такой же результат?
Хм, я даже не думал о таком.
Цель моей программы - сравнение последовательности чисел и вывод "совпадают - не совпадают" и "насколько не совпадают". Я планировал сравнивать по отдельности действительную и мнимую части.

А если вычитать по правилам комплексной арифметики... об этом надо подумать, смогу ли я получить то, что надо.
rotciv
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
27.07.2015, 13:29  [ТС]     Можно ли "подменить" тип данных в процессе выполнения? #5
Не хочет map кушать std::complex.

C++
1
2
3
4
#include <map>
#include <complex>
 
typedef map<string, complex> datablock;
In file included from main.cpp:6:
defs.h:119: error: type/value mismatch at argument 2 in template parameter list for \u2018template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map\u2019
defs.h:119: error: expected a type, got \u2018complex\u2019
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
27.07.2015, 14:23     Можно ли "подменить" тип данных в процессе выполнения? #6
Цитата Сообщение от rotciv Посмотреть сообщение
typedef map<string, complex> datablock;
C++
1
typedef map<string, complex<double> > datablock;
Yandex
Объявления
27.07.2015, 14:23     Можно ли "подменить" тип данных в процессе выполнения?
Ответ Создать тему
Опции темы

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