Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 97

Классы, комплексные числа, возможность записи comp(3+2.2i)

29.08.2014, 03:34. Показов 2398. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Для разминки мозгов решил написать класс больших комплексных чисел(мол число интерпретировать как строку, дабы получить очень большую длину) и к нему всякие перегрузки операций и т.д.(что бы сделать иллюзию стандартного типа). И "стандартизировать" захотелось очень сильно, по этому сразу пришла идея, чтобы была возможность такой записи:
my_class a;
a = 5.1 + 2.4i; ( <=> a = 5.1 + 2.4*i; )
(число будет входить в множество C - комплексных чисел, по этому запись "a = 5.4;" не должна перестать работать)

Я новичок в C++, по этому вопрос, возможно это сделать? По крайней мере было бы очень полезно хотя бы сделать такое:
(number)i --> func(number)
Можно будет извратиться и придумать.
И мои знания говорят, что запись "my_class a = 5.1 + 2.4i;" невозможна в принципе, я прав?

P.S. Вроде бы в C++14 есть такая чтука, как std::complex и такая запись(выше мною предложенная) вполне возможна, тогда вопрос, где найти реализацию, как это сделано?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.08.2014, 03:34
Ответы с готовыми решениями:

классы.комплексные числа
написал, но что то не работает, помогите пожалуйсто... #include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std; class complex{ ...

Комплексные числа и классы в С++
Здравствуйте, не могу разобраться как передать моё значение в классе math другому классу numbers.Перерыл весь гугл, и ничего.. Всю...

Классы и объекты (комплексные числа)
Объект «комплексные числа». Операции определяются по обще принятым формулам. Предусмотреть возможность операции присваивания, сложения,...

23
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
29.08.2014, 05:26
Цитата Сообщение от супер тупой Посмотреть сообщение
где найти реализацию
http://en.cppreference.com/w/c... tor%22%22i
1
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 97
29.08.2014, 14:06  [ТС]
Спасибо большое! Вечером попробую реализовать.
Вопрос о "my_class a = 5.1 + 2.4i;" остается открытым. Какой оператор нужно перегружать, чтобы такая запись была возможна?(или все таки никакой)
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
29.08.2014, 15:52
Цитата Сообщение от супер тупой Посмотреть сообщение
Какой оператор нужно перегружать, чтобы такая запись была возможна?
По ссылке все есть, первый же пример кода:
C++
1
constexpr std::complex<double> operator""i(unsigned long long d) {
0
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 97
29.08.2014, 17:09  [ТС]
Нет, вы меня не поняли, какой оператор нужно перегрузить(если это возможно), чтобы при объявлении переменной класса сразу заполнить её даннымви через "равно". Как и с обычными типами данных, типа int,double, etc.
Пример давал выше "my_class a = 5.1 + 2.4i;"
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
29.08.2014, 18:08
супер тупой, в данном случае выполняются operator""i, operator+ и конструктор копирования.

Добавлено через 4 минуты
Опять же, все есть в доках:
http://en.cppreference.com/w/c... ex/complex
http://en.cppreference.com/w/c... tor_arith3
1
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 97
29.08.2014, 19:16  [ТС]
Все, понял проблему, извиняюсь за затуп
Просто раньше не сделал конструктор копирования и по этому такая запись давала ошибку, теперь все работает, спасибо!
0
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 97
01.09.2014, 01:05  [ТС]
Попытался реализовать и сразу возникла проблема(ожидаемая), компилятор дает ошибку:

my_class operator""i(int); // error: expected identifier before string constant

constexpr my_class operator""i(int); // error: "constexpr" does not name a type

Что я делаю не так?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
01.09.2014, 01:18
Цитата Сообщение от супер тупой Посмотреть сообщение
Что я делаю не так?
Нельзя использовать int в качестве типа параметра. Используй unsigned long long int.

Добавлено через 2 минуты
Цитата Сообщение от супер тупой Посмотреть сообщение
error: "constexpr" does not name a type
Компилятор то поддерживает этот стандарт?
0
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 97
01.09.2014, 01:19  [ТС]
gray_fox,
все равно такие же ошибки выходят, пробовал и другие типы

Цитата Сообщение от gray_fox Посмотреть сообщение
Компилятор то поддерживает этот стандарт?
пользуюсь код блоксом и там есть подсказка на "constexpr", получатся поддерживает?(код блокс не компилятор, это знаю)
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
01.09.2014, 01:24
Ничего не получается. То, что IDE дает подсказку не означает, что компилятор это поддерживает. Посмотрите, какая версия MinGW у Вас установлена. Большинство описанных в теме вещей относятся к C++14. constexpr к C++11. Для его работы нужно в опции компиляции добавить -std=c++11.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
01.09.2014, 01:26
Цитата Сообщение от супер тупой Посмотреть сообщение
пользуюсь код блоксом
Ну наверное g++. У него по умолчанию используется c++03, если хочешь другой, то надо это указывать: -std=c++11 . Возможно это можно сделать и в IDE через какую-нибудь менюшку.
0
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 97
01.09.2014, 01:36  [ТС]
В опциях компилятора указал "-std=c++11" и поставил последний код блокс(ищу версию g++), итог: "error: constexpr does not name a type"
Правда теперь новая ошибка: error: 'my_class& my_class::operator"" i(long long unsigned int)' must be a non-member function

Добавлено через 57 секунд
Цитата Сообщение от Toshkarik Посмотреть сообщение
Большинство описанных в теме вещей относятся к C++14.
Это понятно, но возможна ли тогда такая реализация вне C++14?

Если я не ошибаюсь, то " gcc-c++ (gcc-4.8.1-tdm-1-c++) "
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
01.09.2014, 01:43
Цитата Сообщение от супер тупой Посмотреть сообщение
Правда теперь новая ошибка: error: 'my_class& my_class::operator"" i(long long unsigned int)' must be a non-member function
Ну так вынеси её из класса.
Цитата Сообщение от супер тупой Посмотреть сообщение
ищу версию g++
В терминале (или в cmd, если Windows)
Bash
1
g++ -v
Добавлено через 1 минуту
Цитата Сообщение от супер тупой Посмотреть сообщение
Это понятно, но возможна ли тогда такая реализация вне C++14?
Пользовательские литералы и constexpr есть в с++11
1
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 97
01.09.2014, 01:55  [ТС]
Спасибо, дело идет!

Вынес из класса и компилятор перестал на это ругаться, я так понимаю, эта перегрузка литерала не только для определенного класса?

Теперь новая проблема, которую я немного не понимаю, в выражении "a = a + 5i;" находится ошибка: "error: no match for 'operator+' (operand types are 'my_class' and '__complex__ int')".
Но почему 5i приводится к '__complex__ int', а не используется моя перегрузка?

my_class& operator""i(unsigned long long int a){
my_class b = a;
return b;
}
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
01.09.2014, 02:00
Цитата Сообщение от супер тупой Посмотреть сообщение
C++
1
2
3
4
my_class& operator"" i(unsigned long long int a){
   my_class b = a;
   return b;
}
Зачем ты возвращаешь ссылку на локальный объект? Не надо так делать, возвращай по значению.

Добавлено через 2 минуты
Цитата Сообщение от супер тупой Посмотреть сообщение
Но почему 5i приводится к '__complex__ int', а не используется моя перегрузка?
Возможно это расширение g++, вообще говоря литералы, не начинающиеся с _, зарезервированны для стандартной библиотеки. Переименуй на _i например.
1
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 97
01.09.2014, 02:00  [ТС]
gray_fox, спасибо, учту! Но проблему это не решило

Переименовывал в разные имена, итог: "error: invalid suffix "_i" on integer constant" на строке
C
1
a = a + 123_i;
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
01.09.2014, 02:06
супер тупой, литералы вида 123i являются расширением gcc, как он сам нам говорит. По крайней мере в 4.7.3 ( даже при -std=c++11 ).

Добавлено через 3 минуты
Рабочий пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class A {
   
};
 
A operator"" _i( unsigned long long int ) {
   return A();
}
 
class B {
public:
   B() {
      
   }
   
   B( int ) {
      
   }
};
 
B operator+( const B &, const A & ) {
   return B();
}
 
int main() {
   B b = 12 + 12_i;
   
   return 0;
}
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
01.09.2014, 02:06
Цитата Сообщение от супер тупой Посмотреть сообщение
"error: invalid suffix "_i" on integer constant"
А здесь поменяли?
C++
1
my_class operator"" _i(unsigned long long int)
0
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 97
01.09.2014, 02:09  [ТС]
Toshkarik, ваш пример: "error: invalid suffix "_i" on integer constant".

gray_fox, да, менял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.09.2014, 02:09
Помогаю со студенческими работами здесь

Классы, комплексные числа и перегрузка оператора
Составить описание класса для представления комплексных чисел. Обеспечить вы- полнение операций сложения, вычитания и умножения...

Комплексные числа. Символическая форма записи
Сейчас делаю реализацию класса. Что-то мне подсказывает, что есть ошибки. Тут больше вопрос по математике, в коей я практически ничего не...

Комплексные числа - как привести к такой форме записи?
11532,11 - 220.598i = 11532,11 sin⁡(-178.9) Как первое число привести к тому что после знака равно. И обратно.

Комплексные числа. Действительная и мнимая часть числа. Типы данных
Помогите Паскаль. Составить требуемые подпрограммы работы с комплексными числами (сложение, вычитание, умножение и деление комплексных...

Даны три натуральных числа.Напечатать те цифры,которые есть в записи первого и второго числа,но нет в записи третьего
Даны три натуральных числа.Напечатать те цифры,которые есть в записи первого и второго числа,но нет в записи третьего


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru