Форум программистов, компьютерный форум 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, 15:35     Перезагрузка operator == #41
Цитата Сообщение от silent_1991 Посмотреть сообщение
Bers, ага, т.е. то, что произошёл выход за границы массива - беда, и нужно кидать исключение,
Беда, потому что в 99% это ошибка в управляющей логике вызывающей стороны.
Но исключение кидать не обязательно. Достаточно зажечь ассерт.

А вот хотя бы в дебаг версии дать знать программисту о неполадке - нужно обязательно.

Добавлено через 24 секунды
Цитата Сообщение от silent_1991 Посмотреть сообщение
А вообще - ассертов в релизе быть не должно, они исключительно для отладки.
ваш К.О.

Добавлено через 21 секунду
Цитата Сообщение от silent_1991 Посмотреть сообщение
А с каких пор исключение заламывает процесс-то?
Если нет ловушки, и никто не обработал - крэш
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.11.2011, 15:42     Перезагрузка operator == #42
Цитата Сообщение от Bers Посмотреть сообщение
Беда, потому что в 99% это ошибка в управляющей логике вызывающей стороны.
А деление на нуль нет?

Цитата Сообщение от Bers Посмотреть сообщение
ваш К.О.
Во-первых, заканчивайте с этим. Или опять нарываетесь? А во-вторых, вы только что во второй раз предложили включить ассерт в релизной версии кода. Так что не выёживайтесь.

Цитата Сообщение от Bers Посмотреть сообщение
Если нет ловушки, и никто не обработал - крэш
Потому что надо обрабатывать.
Bers
Заблокирован
15.11.2011, 15:48     Перезагрузка operator == #43
Цитата Сообщение от silent_1991 Посмотреть сообщение
А деление на нуль нет?
Нет.
Цитата Сообщение от silent_1991 Посмотреть сообщение
Во-первых, заканчивайте с этим. Или опять нарываетесь? А во-вторых, вы только что во второй раз предложили включить ассерт в релизной версии кода. Так что не выёживайтесь.
Нет. Я не нарываюсь. Я говорю, что совершенно очевидно, что ассерты не входят в релиз. Это знает любой, кто вообще знает об ассертах. Я не мог сказать, что ассерт включается в релиз. Потому что это хрень полная. А по поводу выёживания - за собой следите.


Цитата Сообщение от silent_1991 Посмотреть сообщение
Потому что надо обрабатывать.
Если работоспособность класса зависит от корректности вызывающей стороны, данный класс не_инвариантен. Он не обеспечивает безопасности своей работы.

Почему это нарушение инкапсуляции см выше.

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

Цитата Сообщение от Bers Посмотреть сообщение
за собой следите
Я-то за собой слежу, пока кое кто не начинает хамить.

Цитата Сообщение от Bers Посмотреть сообщение
Нет.
Вот пока вы не поймёте, что это на самом деле одно и то же, нам не о чем больше говорить.
Bers
Заблокирован
15.11.2011, 15:54     Перезагрузка operator == #45
Цитата Сообщение от silent_1991 Посмотреть сообщение
Я-то за собой слежу, пока кое кто не начинает хамить.
А вы обидчивый. Коли, фраза "ваш К.О." вам видится с обидными контекстом.

И потом, хамить может только сын отцу, или подчиненный начальству. То есть, ниже стоящий вышестоящему. А все прочие могут только нагрубить.

Не слишком ли вы себя высоко ставите?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 15:59     Перезагрузка operator ==
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
silent_1991
15.11.2011, 15:59     Перезагрузка operator ==
  #46
 Комментарий модератора 
Всё, коли пошли личные нападки - тему пора закрывать.
Yandex
Объявления
15.11.2011, 15:59     Перезагрузка operator ==
Закрытая тема Создать тему
Опции темы

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