Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2011, 23:33   #1
stenl1
Форумчанин
 
Аватар для stenl1
 
Регистрация: 26.06.2009
Сообщений: 354
По умолчанию operator==

Код:
// заголовочный .h
#ifndef COMPLEX_H
#define COMPLEX_H

using std::ostream;

class Complex
{
	friend ostream &operator<<(ostream & ,const Complex &) ;
public:
	Complex(double =0.0, double =0.0);
	bool operator==(const Complex &) const;
	bool operator!=(const Complex &) const;
private:
	double real;
	double imaginary;
};

#endif
Код:
//файл реализации .cpp
#include <iostream>
using std::cout;

#include "Complex.h"

 ostream &operator<<(ostream &output ,const Complex &s) 
{
	output<<s.real << " , " <<s.imaginary;
	return output;
}

Complex::Complex(double realPart, double imaginaryPart)
	: real(realPart),
	imaginary(imaginaryPart)
{
}

 bool Complex::operator==(const Complex &operand4) const
{
	if ((real != operand4.real) || (imaginary != operand4.imaginary))  return false ;
	
	return true;
}
 
 bool Complex::operator!=(const Complex &operand4) const
{
	if ((real != operand4.real) || (imaginary != operand4.imaginary))  return true ;
	
	return false;
}
Код:
#include <iostream>
using std::cout;
using std::endl;

#include "Complex.h"

int main()
{
	Complex x;
	Complex y(4.3,1.1);
	Complex z(4.2,1.1);

	if (y == z) cout << " Object ravni";
	else
	cout << " Object ne ravni" ;
	cout << endl;
	

	if (y != z) cout << " @  Object ne ravni";
	else
	cout << " @ Object ravni";
	cout << endl;
	system("pause");
	return 0;
}
Вопрос такой: можно как то покрасивше написать перегрузку операций == и != . Напишите кто и как бы в данном случае сделал перегрузку операций.
stenl1 вне форума Ответить с цитированием
Старый 21.07.2011, 23:36   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
 bool Complex::operator==(const Complex &operand4) const
{
    return (real == operand4.real) && (imaginary == operand4.imaginary);
}
 
 bool Complex::operator!=(const Complex &operand4) const
{
    return !(*this == operand4);
}
пс
Цитата:
Complex(double =0.0, double =0.0);
я бы объявил его explicit конструктором
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 21.07.2011 в 23:46.
pproger вне форума Ответить с цитированием
Старый 21.07.2011, 23:49   #3
stenl1
Форумчанин
 
Аватар для stenl1
 
Регистрация: 26.06.2009
Сообщений: 354
По умолчанию

Цитата:
Complex(double =0.0, double =0.0);
я бы объявил его explicit конструктором
Поясни почему?
stenl1 вне форума Ответить с цитированием
Старый 21.07.2011, 23:52   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2stenl1
комплексное число задается двумя вещественными. какой смысл в записи
Complex val = 10.0?

ну и еще пять копеек вставлю
Цитата:
Complex(double =0.0, double =0.0);
если используешь в функциях аргументы по умолчанию, задавай им имена, иначе будешь ловить всякие лулзы, связанные с принципом максимального куска
Цитата:
func(const char *='some str');
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 22.07.2011 в 00:09.
pproger вне форума Ответить с цитированием
Старый 22.07.2011, 01:07   #5
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2stenl1
комплексное число задается двумя вещественными. какой смысл в записи
Complex val = 10.0?

ну и еще пять копеек вставлю

если используешь в функциях аргументы по умолчанию, задавай им имена, иначе будешь ловить всякие лулзы, связанные с принципом максимального куска
Смысл записи вполне конкретный - создать комплексное число, которое имеет нулевую мнимую часть. Так что ваш аргумент не состоятелен. Здесь другой аргумент имеет место: такое объявление конструктора делает возможным неявным преобразованием типа double в тип Complex там, где это не ожидалось.

Что касается вашего замечания про "косяк", то я в яем он заключается?
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 22.07.2011, 01:29   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
такое объявление конструктора делает возможным неявным преобразованием типа double в тип Complex там, где это не ожидалось.
и что? мой пример с использованием такого конструктора не включает этого подмножества?
Цитата:
Смысл записи вполне конкретный - создать комплексное число, которое имеет нулевую мнимую часть.
Код:
explicit Complex(double =0.0, double =0.0);
...
Complex c = Complex(3.14);
Цитата:
Что касается вашего замечания про "косяк", то я в яем он заключается?
что неясного то? привыкнет человек писать без имен, когда нить напишет такое
Код:
func(const char *='some str');
и код станет зависимым от обязательных пробелов, ибо синтаксический анализатор увидит оператор *= там, где он недопустим. придется это помнить и писать так:
Код:
func(const char * = 'some str');
когда можно всегда писать по-человечески
Цитата:
func(const char *pStr='some str');
func(const char *pStr = 'some str');
и не быть зависимым в данном контексте от сишного принципа максимального куска
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 22.07.2011, 01:37   #7
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
и что? мой пример с использованием такого конструктора не включает этого подмножества?

Код:
explicit Complex(double =0.0, double =0.0);
...
Complex c = Complex(3.14);

что неясного то? привыкнет человек писать без имен, когда нить напишет такое
Код:
func(const char *='some str');
и код станет зависимым от обязательных пробелов, ибо синтаксический анализатор увидит оператор *= там, где он недопустим. придется это помнить и писать так:
Код:
func(const char * = 'some str');
когда можно всегда писать по-человечески

и не быть зависимым в данном контексте от сишного принципа максимального куска
Я думаю, что компилятор этот код не пропустит и выдаст сообщение об ошиьке, так как нет операции умножения для типа char и указателя, а потому абсолютно ничего страшного не вижу в этом коде.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 22.07.2011, 01:44   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Сыроежка
я и не говорю, что это критично. просто плохой стиль. может кто-то не обрамляет пробелами операцию присваивания. + проблемы для различного рода тулз для стилизации кода (astyle например). очень весело будет бегать по проекту и ставить эти пробелы
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 22.07.2011 в 01:47.
pproger вне форума Ответить с цитированием
Старый 22.07.2011, 10:18   #9
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

На самом деле имена формальных аргументов функции лучше всегда задавать, в любом случаи, т.к. они поясняют логическое значение аргумента
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 25.07.2011, 21:53   #10
stenl1
Форумчанин
 
Аватар для stenl1
 
Регистрация: 26.06.2009
Сообщений: 354
По умолчанию

Задал конструктору имя
Код:
Complex(double test=0.0, double  test=0.0);
Как писал pproger.Пробовал и как указатель и как ссылку ,выдает ошибку .Может что я неправильно понял или как надо?
Код:
Complex(double =0.0, double =0.0);
Без имени работает на ура.
stenl1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
operator++ prikolist Общие вопросы C/C++ 17 15.01.2013 16:17
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
operator() в С++ Andrey995 Помощь студентам 4 01.08.2010 03:26
operator<< Наташенька Общие вопросы C/C++ 6 08.06.2009 18:59
Operator C++ EfiopianDIMON Общие вопросы C/C++ 1 13.12.2008 16:52