Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
 Аватар для Scorpion93
3 / 3 / 3
Регистрация: 31.10.2010
Сообщений: 120

Перезагрузка operator ==

13.11.2011, 02:40. Показов 4377. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тренируюсь и пишу клас комплексных чисел. Проблема с перезагнрузкой оператора сравнения да и другие перезагрузки не хотят использоваться. Как решить эту проблему? Ведь желательно передавать константные ссылки? Но к ним уже стает проблематично использовать перезагрузки..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <math.h>
 
using namespace std;
class MyComplex
{
private:
    double a;
    double b;
public:
    MyComplex(void);
    MyComplex(double,double);
    void ConsoleInput();
    void ConsoleOutput();
    string Output();
    bool operator==(double);
    MyComplex operator +(const MyComplex &);
    MyComplex operator -(const MyComplex &);
    MyComplex operator *(const MyComplex &);
    MyComplex operator /(const MyComplex &);    
    ~MyComplex(void);
};
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "StdAfx.h"
#include "MyComplex.h"
 
 
MyComplex::MyComplex(void): a(0),b(0)
{   
     
}
MyComplex::~MyComplex(void)
{
}
MyComplex::MyComplex(double x,double y):a(x),b(y)
{
}
void MyComplex::ConsoleInput()
{
    
    cout<<"Real:";
    cin>>a;
    cout<<"Imagine:";
    cin>>b; 
}
void MyComplex::ConsoleOutput()
{
    if (b<0) cout<<a<<"-i"<<b;
    if (b==0) cout<<a;
    if (b>0) cout<<a<<"+i"<<b;
    cout<<endl; 
}
string MyComplex::Output()
{
    string s;
    return s;
}
MyComplex MyComplex::operator +(const MyComplex & r)
{
    return MyComplex(a+r.a,b+r.b);
}
MyComplex MyComplex::operator -(const MyComplex & r)
{
    return MyComplex(a-r.a,b-r.b);
}
MyComplex MyComplex::operator *(const MyComplex & r)
{
    return MyComplex(a*r.a-b*r.b,b*r.a+a*r.b);
}
MyComplex MyComplex::operator /(const MyComplex & r)
{
        r==0.0; // тут ошибка: Ошибка    1   error C2678: бинарный "==": не найден оператор, принимающий левый операнд типа "const MyComplex" (или приемлемое преобразование отсутствует)   d:\test\test\mycomplex.cpp  49  1   test
        if (r.a==0 && r.b==0) throw 1; 
        return MyComplex((a*r.a+b*r.b)/(pow(r.a,2)+pow(r.b,2)),(b*r.a-a*r.b)/(pow(r.a,2)+pow(r.b,2)));
}
bool MyComplex::operator==(double zero)
{
    return a==0 && b==0;
}
Добавлено через 2 минуты
И еще вопрос к try catch: Посоветуйте как правильно отловить ошибку с делением на 0.
C++
1
2
3
4
5
6
7
8
9
try
    {
            c=a/b;
            c.ConsoleOutput();
    }
    catch (int a)
    {
        cout<<"Error! Division by zero!"<<endl;
}
вот в мейне присутствует такой код, он работает. Так делать нормально?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.11.2011, 02:40
Ответы с готовыми решениями:

перезагрузка operator +
есть самописный класс String; в нем определены операторы + для, String + String String + char String + *char для вывода в поток и...

Перезагрузка operator -
Есть одна задача : Одномерный массив а и b. Класс одномерный массив. Реализовать для объектов данного класса перезагрузку операции -...

Перезагрузка операторов "неоднозначный operator"
Не знаю в ту ли группу пишу, но все же.... Для моего класса есть несколько операторов присвоения const MyStr&amp; operator +=(const...

45
Заблокирован
15.11.2011, 14:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от taras atavin Посмотреть сообщение
Но если всё таки исключение необходимо, то придётся его бросить, иначе крах гарантированно будет до того, как кто то что то не обработает, а так хоть какая то надежда на продолжение работы. Но без нужды не кидать.
Ну дык, о том и речь - что исключение нужно кидать когда случилась исключительная ситуация, а не по малейшему поводу и без повода.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.11.2011, 14:27
Цитата Сообщение от Bers Посмотреть сообщение
Даже если класс кинул исключение, отловить его и разрулить проблему должна система, к которой принадлежит класс, а не пользователь, который вообще не обязан знать о том, какие, и по какой причине класс может кинуть исключения.
А если проблема в неправильном вводе? Так что это правило тоже надо переписать так: без нужды не говорить пользователю об исключениях.
0
Заблокирован
15.11.2011, 14:28
Цитата Сообщение от taras atavin Посмотреть сообщение
А если проблема в неправильном вводе?
Что такое "неправильный ввод" ?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.11.2011, 14:41
Цитата Сообщение от silent_1991 Посмотреть сообщение
чем деление на нуль отличается от выхода за границы массива?
Деление на ноль - не допустимая математическая операция, а выход за границу массива - недопустимая адресация. Вот представь себе:
1. Ты вычисляешь, сколько залить бензина в бак. Результат не может быть ни бесконечным, ни неопределённым, ни отрицательным, ни имеющим мнимую часть. А ты поделил на ноль. (x/y)*y=x, z*0=0, при любом x<>0, z=x/y, получаем, что при y=0 будет (x/0)*0=x, z*0=x, 0=x, 0<>0. Это не допустимо математически.
2. Ты говоришь таксисту адрес: страна Выдумляндия, область Кисельных Облаков, город Молокореченск, улица Сказочников, дом минус восемь с половиной. Это не существующий адрес, но вычислять его не надо.

Добавлено через 4 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Что такое "неправильный ввод" ?
Это если пользователь ввёл текст вместо числа, ноль на место делителя, отрицательное количество, не существующее имя файла, или ещё какие невалидные данные и сделал это вручную.
0
Заблокирован
15.11.2011, 14:45
Цитата Сообщение от taras atavin Посмотреть сообщение
Например, пользователь ввёл текст вместо числа, ноль на место делителя, отрицательное количество, не существующее имя файла, или ещё какие невалидные данные и сделал это вручную.
"извините, ожидалось число, а не текст. Введите данные заного"
"извините, но делитель нулем быть не может. введите другой делитель"
и тп.

это ШТАТНАЯ работа любого морального терминала - проверить что введёт пользователь.
Накой чорт тут вообще может понадобится бросать исключения? Кто их будит обрабатывать? Блондинка, которая тыкает в сенсорный экранчик терминала, пытаясь внести деньги на счет?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.11.2011, 14:46
Цитата Сообщение от Bers Посмотреть сообщение
1. Они захламляют код, и ухудшают читабельность.
Конечно, не то, что возврат результат выполнения и кода ошибки в одно и том же месте...
Цитата Сообщение от Bers Посмотреть сообщение
2. Нарушают инкапсуляцию класса.
Каким образом?
Цитата Сообщение от Bers Посмотреть сообщение
3. Нарушают инвариант класса.
Это и без исключений можно сделать. Всё от прямоты рук зависит.
Цитата Сообщение от Bers Посмотреть сообщение
4. Идеологически - это последний рубеж обороны класса в борьбе за выживаемость системы.
Его следует использовать только тогда, когда очевидно, что класс своими силами не в состоянии справиться с возникшей проблемой, в надежде, что вызывающая сторона сумеет разрулить проблему.
Подо всё это сильно-сильно подходит деление на нуль.
Цитата Сообщение от Bers Посмотреть сообщение
5. Даже если класс кинул исключение, отловить его и разрулить проблему должна система, к которой принадлежит класс, а не пользователь, который вообще не обязан знать о том, какие, и по какой причине класс может кинуть исключения.
А кто-то говорит, что это должно вернуться непременно пользователю?
0
Заблокирован
15.11.2011, 14:50
Цитата Сообщение от silent_1991 Посмотреть сообщение
Каким образом?
Вынуждает пользователей знать внутренее устройство класса. Знать когда, какие, и по какой причине он может кинуть исключения. ЗАСТАВЛЯЕТ пользователя строить ловушки исключений, потому что класс тупо спихивает отвественность за крэш на пользователя. То, как быть и как разруливать ситуацию придётся решать пользователю. Пользователю придётся познать природу возможных исключений, познать то, что приводит к ним, что бы понять как их можно обработать.

Это при том, что инкапсуляция гарантирует пользователю, что он может пользоваться классом ничего не зная о его устройстве.

Итого: нарушение инкапсуляции.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.11.2011, 14:51
Цитата Сообщение от Bers Посмотреть сообщение
Кто их будит обрабатывать? Блондинка, которая тыкает в сенсорный экранчик терминала, пытаясь внести деньги на счет?
Что за бред?
0
Заблокирован
15.11.2011, 14:53
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что за бред?
сабж:

Цитата Сообщение от taras atavin Посмотреть сообщение
Это если пользователь ввёл текст вместо числа, ноль на место делителя, отрицательное количество, не существующее имя файла, или ещё какие невалидные данные и сделал это вручную.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.11.2011, 14:55
Цитата Сообщение от Bers Посмотреть сообщение
Вынуждает пользователей знать внутренее устройство класса
Это с чего бы вдруг?
Цитата Сообщение от Bers Посмотреть сообщение
Знать когда, какие, и по какой причине он может кинуть исключения
А это он обязан знать, иначе нормальной работы с классом не будет.
Цитата Сообщение от Bers Посмотреть сообщение
класс тупо спихивает отвественность за крэш на пользователя
А на кого ему спихивать ответственность (учтём, что вместо "пользователь" стоит читать "вызывающая сторона"). Что ему делать, если пришли невалидные данные? Надеяться, что их кто-та там раньше обработал? А если нет? Падать в рантайме? Кул.
Цитата Сообщение от Bers Посмотреть сообщение
Это при том, что инкапсуляция гарантирует пользователю, что он может пользоваться классом ничего не зная о его устройстве.
Исключения ну никак с внутренним устройством класса не связаны.
0
Заблокирован
15.11.2011, 14:56
Цитата Сообщение от silent_1991 Посмотреть сообщение
А это он обязан знать, иначе нормальной работы с классом не будет.
он обязан знать публичный интерфейс класса. Все.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.11.2011, 14:57
Цитата Сообщение от Bers Посмотреть сообщение
сабж:
А что, кто-то говорил, что пользователю должно вывалиться непонятное окно с номером строки и внутренним представлением ошибки? Речь о том, что класс, обрабатывающий эти данный, видит, что они невалидны, кидает исключение, а вызывающая сторона (части системы, отвечающая за аварийные ситуации, например), предоставляет пользователю дружелюбное окошко с просьбой повторить ввод и указанием на ошибку.
0
Заблокирован
15.11.2011, 14:58
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что ему делать, если пришли невалидные данные?
То, что положенно по штатной работе:
Запросить данные заного, или Вернуть код ошибки, или ещё что либо - зависит от задачи, и фантазии автора класса.

Вопрос: ситуация с кривыми входными данными вполне ожидаемая. С какой пор вполне ожидаемые ситуации вдруг стали исключительными?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.11.2011, 14:59
Цитата Сообщение от Bers Посмотреть сообщение
он обязан знать публичный интерфейс класса. Все.
Исключения в какой-то мере тоже можно назвать публичным интерфейсом, поскольку через них (в том числе) класс общается с внешним миром.
0
Заблокирован
15.11.2011, 14:59
Цитата Сообщение от taras atavin Посмотреть сообщение
Это если пользователь ввёл текст вместо числа, ноль на место делителя, отрицательное количество, не существующее имя файла, или ещё какие невалидные данные и сделал это вручную.
Вызывающая сторона - это программный код. В данном случае имели ввиду данные, которые вводит живой человек.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.11.2011, 15:03
Bers, а ничего, что живому человеку пофиг на всё, в том числе на то, на каком языке написана программа и как обрабатываются ошибки? Ему надо в одну формочку вбить данные и в другой получить результат. Среда сама всё это обработает. Исключения как раз для неё и кидаются, а не для блондинки, которая строку вместо числа ввела.
0
Заблокирован
15.11.2011, 15:05
Цитата Сообщение от silent_1991 Посмотреть сообщение
Исключения в какой-то мере тоже можно назвать публичным интерфейсом, поскольку через них (в том числе) класс общается с внешним миром.
исключительные ситуации происходят по независящим от класса причинам. Причем класс никак не может их спрогнозировать.

Они не имеют ни малейшего отношения ни к пользвателям, ни к самому классу.

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

Эта ситуация возникла не по причине не_валидных данных, и не по причине программной ошибки. Это исключительная ситуация, которую класс не в состоянии никак заранее предсказать.

Эту ошибку вызывающая сторона так же не в состоянии обработать, если она не в курсе почему произошла трагедия.
Что бы она была в курсе, она должна знать устройство класса.

Если вы пишите класс, который что бы надёжно работал - требовал бы знать его внутренности, то ваши классы - нарушение инкапсцуляции, и безотственность. Другими словами - быдлокод

Добавлено через 1 минуту
Цитата Сообщение от silent_1991 Посмотреть сообщение
Bers, а ничего, что живому человеку пофиг на всё, в том числе на то, на каком языке написана программа и как обрабатываются ошибки? Ему надо в одну формочку вбить данные и в другой получить результат. Среда сама всё это обработает. Исключения как раз для неё и кидаются, а не для блондинки, которая строку вместо числа ввела.
Я специально учтонил у человека, что он имел ввиду. Это понятно?
И ответил ему в соотвествии с тем, что он имел ввиду. Это понятно?

Если это понятно, то какие ещё есть вопросы? Что тогда не понятно?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.11.2011, 15:19
Bers, ну да, я всегда утверждал, что весь стл - быдлокод, вектор в частности. Ишь ты, чтобы корректно с ним работать, надо знать, что он std::out_of_range кидает, падлюка! Инкапсуляция нарушена, демократия в опасности.
0
Заблокирован
15.11.2011, 15:27
Цитата Сообщение от silent_1991 Посмотреть сообщение
Bers, ну да, я всегда утверждал, что весь стл - быдлокод, вектор в частности. Ишь ты, чтобы корректно с ним работать, надо знать, что он std::out_of_range кидает, падлюка! Инкапсуляция нарушена, демократия в опасности.

А я знал на самом деле, что обязательно кто нибудь скажет про стл.

Потому что вы все говорите одно и тоже.
Выход за пределы диапазона массива - есть программная ошибка в 99% случаев.

Вектор кидает исключение именно потому, что если их не обработать - будит бабах!
Именно потому, что бы услужливо показать вызывающей стороне, что у неё программная ошибка.
Оказывает услугу. Что бы программист-пользователь в кратчайшее время узнал, что что-то не так с его кодом.

Что характерно, если вектор не не кинет исключение (без проверки диапазона), то исключение выкинет ище какая нибудь хрень. В любом случае будит крушение.
Я ни разу не ставил ловушку на такое исключение. Я принципе не знаю как можно обработать программную ошибку.
Если такое исключение сработало, нужно включать отладчик, и дебажить до посинения. Ловушки тут не помогут

Хотя я лично в случае если интерпритирую ситуацию как вероятную ошибку программиста в вызывающей стороне, никаких исключений все равно не кидаю. А зажигаю ассерт, который не заламывает процесс. И делаю откат операции.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.11.2011, 15:34
Bers, ага, т.е. то, что произошёл выход за границы массива - беда, и нужно кидать исключение, а то, что в каких-то сложных вычислениях произошло деление на нуль - фигня, само поправится.

Не по теме:

P.S. Про stl я уже давно сказал, но вы, по-видимому, не желали слушать.



Добавлено через 57 секунд
Цитата Сообщение от Bers Посмотреть сообщение
А зажигаю ассерт, который не заламывает процесс.
А с каких пор исключение заламывает процесс-то?

Добавлено через 33 секунды
А вообще - ассертов в релизе быть не должно, они исключительно для отладки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2011, 15:34

Class & operator's |Error: undefined reference to operator
Компилирует нормально, но когда хочу использовать оператор выдает ошибку:undefined reference to 'operator..(Fraction const&amp;, Fraction...

Перегрузка operator>> и operator<< в абстрактном классе
Здрасьте! Есть необходимость перегрузить потоки, Я знаю как это сделать через friend, но вот кажется что есть и другое решение. Попытался...

Вызов operator[] через operator[] const
Перелистывал Майерса, наткнулся на код, подскажите пожалуйста почему он советует закомментированный вариант кода, не проще сделать как...

operator char() или operator int()
Здорова госпдо! Снова ничо не ясно как всегда. Разбираю программку из книги Страуструпа, там он описывает класс String в нем есть ...

Реализация operator + через operator +=
внутри следующей темы возник вопрос, ответ на который так и не был получен: ...


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

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru