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

Перезагрузка operator == - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Scorpion93
 Аватар для Scorpion93
2 / 2 / 0
Регистрация: 31.10.2010
Сообщений: 120
13.11.2011, 02:40     Перезагрузка operator == #1
Тренируюсь и пишу клас комплексных чисел. Проблема с перезагнрузкой оператора сравнения да и другие перезагрузки не хотят использоваться. Как решить эту проблему? Ведь желательно передавать константные ссылки? Но к ним уже стает проблематично использовать перезагрузки..

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;
}
вот в мейне присутствует такой код, он работает. Так делать нормально?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2011, 02:40     Перезагрузка operator ==
Посмотрите здесь:

Перезагрузка operator - C++
C++ operator <<
перезагрузка operator + C++
operator char() или operator int() C++
Перезагрузка операторов "неоднозначный operator" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
15.11.2011, 14:26     Перезагрузка operator == #21
Цитата Сообщение от taras atavin Посмотреть сообщение
Но если всё таки исключение необходимо, то придётся его бросить, иначе крах гарантированно будет до того, как кто то что то не обработает, а так хоть какая то надежда на продолжение работы. Но без нужды не кидать.
Ну дык, о том и речь - что исключение нужно кидать когда случилась исключительная ситуация, а не по малейшему поводу и без повода.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 14:27     Перезагрузка operator == #22
Цитата Сообщение от Bers Посмотреть сообщение
Даже если класс кинул исключение, отловить его и разрулить проблему должна система, к которой принадлежит класс, а не пользователь, который вообще не обязан знать о том, какие, и по какой причине класс может кинуть исключения.
А если проблема в неправильном вводе? Так что это правило тоже надо переписать так: без нужды не говорить пользователю об исключениях.
Bers
Заблокирован
15.11.2011, 14:28     Перезагрузка operator == #23
Цитата Сообщение от taras atavin Посмотреть сообщение
А если проблема в неправильном вводе?
Что такое "неправильный ввод" ?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 14:41     Перезагрузка operator == #24
Цитата Сообщение от 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 Посмотреть сообщение
Что такое "неправильный ввод" ?
Это если пользователь ввёл текст вместо числа, ноль на место делителя, отрицательное количество, не существующее имя файла, или ещё какие невалидные данные и сделал это вручную.
Bers
Заблокирован
15.11.2011, 14:45     Перезагрузка operator == #25
Цитата Сообщение от taras atavin Посмотреть сообщение
Например, пользователь ввёл текст вместо числа, ноль на место делителя, отрицательное количество, не существующее имя файла, или ещё какие невалидные данные и сделал это вручную.
"извините, ожидалось число, а не текст. Введите данные заного"
"извините, но делитель нулем быть не может. введите другой делитель"
и тп.

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

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

Итого: нарушение инкапсуляции.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.11.2011, 14:51     Перезагрузка operator == #28
Цитата Сообщение от Bers Посмотреть сообщение
Кто их будит обрабатывать? Блондинка, которая тыкает в сенсорный экранчик терминала, пытаясь внести деньги на счет?
Что за бред?
Bers
Заблокирован
15.11.2011, 14:53     Перезагрузка operator == #29
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что за бред?
сабж:

Цитата Сообщение от taras atavin Посмотреть сообщение
Это если пользователь ввёл текст вместо числа, ноль на место делителя, отрицательное количество, не существующее имя файла, или ещё какие невалидные данные и сделал это вручную.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.11.2011, 14:55     Перезагрузка operator == #30
Цитата Сообщение от Bers Посмотреть сообщение
Вынуждает пользователей знать внутренее устройство класса
Это с чего бы вдруг?
Цитата Сообщение от Bers Посмотреть сообщение
Знать когда, какие, и по какой причине он может кинуть исключения
А это он обязан знать, иначе нормальной работы с классом не будет.
Цитата Сообщение от Bers Посмотреть сообщение
класс тупо спихивает отвественность за крэш на пользователя
А на кого ему спихивать ответственность (учтём, что вместо "пользователь" стоит читать "вызывающая сторона"). Что ему делать, если пришли невалидные данные? Надеяться, что их кто-та там раньше обработал? А если нет? Падать в рантайме? Кул.
Цитата Сообщение от Bers Посмотреть сообщение
Это при том, что инкапсуляция гарантирует пользователю, что он может пользоваться классом ничего не зная о его устройстве.
Исключения ну никак с внутренним устройством класса не связаны.
Bers
Заблокирован
15.11.2011, 14:56     Перезагрузка operator == #31
Цитата Сообщение от silent_1991 Посмотреть сообщение
А это он обязан знать, иначе нормальной работы с классом не будет.
он обязан знать публичный интерфейс класса. Все.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.11.2011, 14:57     Перезагрузка operator == #32
Цитата Сообщение от Bers Посмотреть сообщение
сабж:
А что, кто-то говорил, что пользователю должно вывалиться непонятное окно с номером строки и внутренним представлением ошибки? Речь о том, что класс, обрабатывающий эти данный, видит, что они невалидны, кидает исключение, а вызывающая сторона (части системы, отвечающая за аварийные ситуации, например), предоставляет пользователю дружелюбное окошко с просьбой повторить ввод и указанием на ошибку.
Bers
Заблокирован
15.11.2011, 14:58     Перезагрузка operator == #33
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что ему делать, если пришли невалидные данные?
То, что положенно по штатной работе:
Запросить данные заного, или Вернуть код ошибки, или ещё что либо - зависит от задачи, и фантазии автора класса.

Вопрос: ситуация с кривыми входными данными вполне ожидаемая. С какой пор вполне ожидаемые ситуации вдруг стали исключительными?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.11.2011, 14:59     Перезагрузка operator == #34
Цитата Сообщение от Bers Посмотреть сообщение
он обязан знать публичный интерфейс класса. Все.
Исключения в какой-то мере тоже можно назвать публичным интерфейсом, поскольку через них (в том числе) класс общается с внешним миром.
Bers
Заблокирован
15.11.2011, 14:59     Перезагрузка operator == #35
Цитата Сообщение от taras atavin Посмотреть сообщение
Это если пользователь ввёл текст вместо числа, ноль на место делителя, отрицательное количество, не существующее имя файла, или ещё какие невалидные данные и сделал это вручную.
Вызывающая сторона - это программный код. В данном случае имели ввиду данные, которые вводит живой человек.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.11.2011, 15:03     Перезагрузка operator == #36
Bers, а ничего, что живому человеку пофиг на всё, в том числе на то, на каком языке написана программа и как обрабатываются ошибки? Ему надо в одну формочку вбить данные и в другой получить результат. Среда сама всё это обработает. Исключения как раз для неё и кидаются, а не для блондинки, которая строку вместо числа ввела.
Bers
Заблокирован
15.11.2011, 15:05     Перезагрузка operator == #37
Цитата Сообщение от silent_1991 Посмотреть сообщение
Исключения в какой-то мере тоже можно назвать публичным интерфейсом, поскольку через них (в том числе) класс общается с внешним миром.
исключительные ситуации происходят по независящим от класса причинам. Причем класс никак не может их спрогнозировать.

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

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

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

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

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

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

Если это понятно, то какие ещё есть вопросы? Что тогда не понятно?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.11.2011, 15:19     Перезагрузка operator == #38
Bers, ну да, я всегда утверждал, что весь стл - быдлокод, вектор в частности. Ишь ты, чтобы корректно с ним работать, надо знать, что он std::out_of_range кидает, падлюка! Инкапсуляция нарушена, демократия в опасности.
Bers
Заблокирован
15.11.2011, 15:27     Перезагрузка operator == #39
Цитата Сообщение от silent_1991 Посмотреть сообщение
Bers, ну да, я всегда утверждал, что весь стл - быдлокод, вектор в частности. Ишь ты, чтобы корректно с ним работать, надо знать, что он std::out_of_range кидает, падлюка! Инкапсуляция нарушена, демократия в опасности.

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

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

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

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

Хотя я лично в случае если интерпритирую ситуацию как вероятную ошибку программиста в вызывающей стороне, никаких исключений все равно не кидаю. А зажигаю ассерт, который не заламывает процесс. И делаю откат операции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 15:34     Перезагрузка operator ==
Еще ссылки по теме:

C++ Expected init-declarator before "operator".expected `,' or `;' before "operator"
Operator = C++
Реализация operator + через operator += C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.11.2011, 15:34     Перезагрузка operator == #40
Bers, ага, т.е. то, что произошёл выход за границы массива - беда, и нужно кидать исключение, а то, что в каких-то сложных вычислениях произошло деление на нуль - фигня, само поправится.

Не по теме:

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



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

Добавлено через 33 секунды
А вообще - ассертов в релизе быть не должно, они исключительно для отладки.
Yandex
Объявления
15.11.2011, 15:34     Перезагрузка operator ==
Закрытая тема Создать тему
Опции темы

Текущее время: 15:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru