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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.92
FiXeR
7 / 7 / 1
Регистрация: 18.12.2009
Сообщений: 33
#1

Перегрузка бинарного оператора - C++

31.05.2010, 16:31. Просмотров 5538. Ответов 9
Метки нет (Все метки)

Хочу чтобы в моей программе знак "%" работал, как знак операция сложения действительных чисел "+". Где ошибка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdlib>
#include <iostream>
#include <conio.h>
using namespace std;
 
int operator %(int a,int b)
{   int c;
    c=a+b;             
    return c;
 }
 
int main()
{   int a,b,c;
a=1;
b=2;
    c=a%b;
    cout<<c<endl;
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2010, 16:31     Перегрузка бинарного оператора
Посмотрите здесь:

Перегрузка бинарного оператора + - C++
Добрый вечер! В последнее время мне не удаётся перегрузить оператор +, чтобы он поэлементно складывал одномерные массивы двух классов. ...

Перегрузка бинарного оператора + - C++
Выдает ошибку: Ошибка 2 error LNK1120: неразрешенных внешних элементов: 1 Main\Debug\Main.exe 1 Ошибка 1 error LNK2019: ссылка на...

Перегрузка бинарного оператора << в template классе - C++
Помогите пожалйста люди! не получается перегрузить оператор &gt;&gt; и &lt;&lt; в шаблонном классе выдает ошибку: error C2804: бинарный 'operator...

Ошибка в использовании бинарного оператора - C++
Доброго времени суток коллеги. Знакомлюсь с языком C++ по книге Герберта Шилдта. Возник вопрос который в книге не написан. Не могу...

Перегрузка бинарного плюса - C++
Ребят, есть перегрузка плюса, написанная для стека. стек реализован в виде массива(это не столь важно) template &lt;class Type1&gt; ...

Переопределение БИНАРНОГО оператора внутри класса - C++
Подскажите как правильно переопределить оператор + для сласса chislo. class chislo { int val; chislo chislo::operator +(const...

Перегрузка оператора - C++
Помогите доделать задание... Это в классе метод, осуществляющий ввод значений полей класса с клавиатуры; метод, осуществляющий...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,498
31.05.2010, 16:40     Перегрузка бинарного оператора #2
FiXeR, беда в том, что оператор %(int, int) и так существует. И перегрузить его не изменив передаваемые параметры не получится. Если так сильно хочется, можно свой класс создать, и в нём открытый статический метод такой сделать. Только вызываться это чудо как-то странно будет. Да и зачем Вам оно?..
FiXeR
7 / 7 / 1
Регистрация: 18.12.2009
Сообщений: 33
31.05.2010, 17:06  [ТС]     Перегрузка бинарного оператора #3
Мне надо понять как перегрузить оператор, вы предлагаете зделать методом, как это будет выглядеть, если можно покажите на коде.
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,498
31.05.2010, 17:30     Перегрузка бинарного оператора #4
FiXeR, можно вот так например сделать:
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
#include <iostream>
 
class MyClass {
    int _val; // ну или нужный тип данных
public:
    MyClass() : _val(0) {}
    MyClass(int val) : _val(val) {}
    ~MyClass() {}
    int value() const { return _val; }
    void value(int val) { _val = val; }
};
 
MyClass operator% (const MyClass & a, const MyClass & b) {
    MyClass r(a.value() + b.value());
    return r;
}
 
std::ostream & operator << (std::ostream & ost, const MyClass & mc){
    ost << mc.value();
    return ost;
}
 
int main(){
    MyClass a(2), b(2), c;
 
    std::cout << "a = " << a << "; b = " << b << std::endl;
    c = a % b;
    std::cout << "a % b = " << c << std::endl;
 
    return 0;
}
Код
$ ./overload_percent 
a = 2; b = 2
a % b = 4
Serhiy_UA
0 / 0 / 0
Регистрация: 17.06.2012
Сообщений: 8
18.12.2012, 23:16     Перегрузка бинарного оператора #5
В предыдущем коде меня интересует 9-тая строка, а именно
C++
1
    int value() const { return _val; }
Почему здесь стоит служебное слово const ?
Я знаю, что без него программа работать не будет. Я хочу знать, согласно какого правила так надо писать. Тыкните меня носом, пожалуйста.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
18.12.2012, 23:23     Перегрузка бинарного оператора #6
Serhiy_UA, может так
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>
 
class ABC
{
private:
   const int val;
public:
   ABC(const int& val_)
      : val(val_)
   {
      
   }
   int operator%(const int& val2)
   {
      return val + val2;
   }
};
 
int main()
{
   std::cout << static_cast<ABC> (5) % 10 << std::endl;
}
http://liveworkspace.org/code/426jaY$0
Serhiy_UA
0 / 0 / 0
Регистрация: 17.06.2012
Сообщений: 8
19.12.2012, 00:03     Перегрузка бинарного оператора #7
go,
хочу обратить ваше внимание на код от easybudda.
Там есть метод
C++
1
2
3
MyClass operator% (const MyClass & a, const MyClass & b) {
    MyClass r(a.value() + b.value());
    return r;
Который не будет даже компилироваться(нельзя обратить к методу a.value()), если в описании метода value() нет слова "const".
Согласно какого правила там нужно ставить слово const?
David Sylva
1285 / 947 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
19.12.2012, 00:12     Перегрузка бинарного оператора #8
Цитата Сообщение от Serhiy_UA Посмотреть сообщение
Который не будет даже компилироваться(нельзя обратить к методу a.value()), если в описании метода value() нет слова "const".
Согласно какого правила там нужно ставить слово const?
Слово const после круглых скобок в объявление(определение ) функции, означает, что эти функции не изменяют состояния класса.
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,498
19.12.2012, 03:07     Перегрузка бинарного оператора #9
Цитата Сообщение от Serhiy_UA Посмотреть сообщение
В предыдущем коде меня интересует 9-тая строка, а именно
C++
1
    int value() const { return _val; }
Почему здесь стоит служебное слово const ?
Я знаю, что без него программа работать не будет. Я хочу знать, согласно какого правила так надо писать. Тыкните меня носом, пожалуйста.
Посмотрите, как передаются параметры в функции в 13 и 18 строке - как ссылки на константные объекты. Компилятор не проверяет, что на самом деле происходит внутри методов класса при вызове их из функции, но раз уж переданный по ссылке объект класса не должен изменяться, должна быть гарантия, что вызываемые внутри функции методы не изменят сам объект. Что, как уже верно заметили, и достигается объявлением метода, как константного. В качестве эксперимента попробуйте внутри константного метода как-нибудь изменить переменную, значение которой он возвращает. Оно, конечно, снова не скомпилируется (не должно бы по крайней мере), но прочитать сообщение об ошибке в этом случае тоже будет полезно...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 14:19     Перегрузка бинарного оператора
Еще ссылки по теме:

Перегрузка оператора == - C++
Я уже встречала подобный вопрос на этом форуме, но у меня всё равно что-то не получается Вот виртуальная ф-ция, которую я вызываю в...

Перегрузка оператора [][] - C++
допустим у меня есть клас Matrix и я хочу опедилить оператор доступа к его елементу как реализовть оператор если простой масив я знаю а...

Перегрузка оператора == - C++
Есть шаблонный класс List (не имеющий перегруженных операторов) и есть шаблонный класс ListWithName, который наследует List и из своих...

Перегрузка оператора - C++
Здравствуйте. Нужна помощь) Есть такой класс: class vect { public: float *items; vect() { items = new float; for(int...

Перегрузка оператора + - C++
String String::operator + (String &amp; sg2) { String tmp; tmp.str = new char ; strcpy (tmp.str, str); strcat (tmp.str, sg2.str);...


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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
19.12.2012, 14:19     Перегрузка бинарного оператора #10
Цитата Сообщение от David Sylva Посмотреть сообщение
Слово const после круглых скобок в объявление(определение ) функции, означает, что эти функции не изменяют состояния класса.
Угу, только вот поля помеченные как mutable могут меняться. А вообще он написан для константных объектов. Уберите слово const и увидите error`ы.
Yandex
Объявления
19.12.2012, 14:19     Перегрузка бинарного оператора
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru