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

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

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

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

24.07.2015, 16:40. Просмотров 274. Ответов 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     Можно ли "подменить" тип данных в процессе выполнения?
Посмотрите здесь:

C++ Абстрактный тип данных "СПИСОК"
C++ Тип данных "Anketa" - не получается ввести пол
C++ Как отследить результат выполнения "cmd dir"?
Для чего функции поместили в "тип данных"? C++
Вывести сообщение "Можно", если из букв введенной строки X можно составить введенную строку Y C++
Абстрактный тип данных "Собака" C++
Как правильно задать параметр "время выполнения алгоритма"? C++
C++ Ошибка "Debug Assertion Failed" после выполнения программы
Можно ли добавить "уточнение" данных C++
Определить тип данных "множество целых чисел" C++
Объяснить термин "абстрактный тип данных" C++
C++ Почему происходит ошибка времени выполнения в решении задачи "Ход конем"?

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

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

А вообще, думаю тут все можно красиво разрешить с использованием шаблонов (template) и перегрузкой операторов.
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 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
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
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