Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

31.05.2010, 16:31. Просмотров 5961. Ответов 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;
}
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: ссылка на...

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

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

Определение класса, описывающего комплексное число. Перегрузка для него бинарного оператора "*" - C++
1. Определить класс, описывающий комплексное число. Для класса перегрузить бинарный оператор *. Написать программу, в которой используется...

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

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

9
easybudda
Модератор
Эксперт CЭксперт С++
9714 / 5665 / 971
Регистрация: 25.07.2009
Сообщений: 10,910
31.05.2010, 16:40 #2
FiXeR, беда в том, что оператор %(int, int) и так существует. И перегрузить его не изменив передаваемые параметры не получится. Если так сильно хочется, можно свой класс создать, и в нём открытый статический метод такой сделать. Только вызываться это чудо как-то странно будет. Да и зачем Вам оно?..
1
FiXeR
7 / 7 / 1
Регистрация: 18.12.2009
Сообщений: 33
31.05.2010, 17:06  [ТС] #3
Мне надо понять как перегрузить оператор, вы предлагаете зделать методом, как это будет выглядеть, если можно покажите на коде.
0
easybudda
Модератор
Эксперт CЭксперт С++
9714 / 5665 / 971
Регистрация: 25.07.2009
Сообщений: 10,910
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
2
Serhiy_UA
0 / 0 / 0
Регистрация: 17.06.2012
Сообщений: 8
18.12.2012, 23:16 #5
В предыдущем коде меня интересует 9-тая строка, а именно
C++
1
    int value() const { return _val; }
Почему здесь стоит служебное слово const ?
Я знаю, что без него программа работать не будет. Я хочу знать, согласно какого правила так надо писать. Тыкните меня носом, пожалуйста.
0
go
Эксперт С++
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
1
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?
0
David Sylva
1291 / 953 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
19.12.2012, 00:12 #8
Цитата Сообщение от Serhiy_UA Посмотреть сообщение
Который не будет даже компилироваться(нельзя обратить к методу a.value()), если в описании метода value() нет слова "const".
Согласно какого правила там нужно ставить слово const?
Слово const после круглых скобок в объявление(определение ) функции, означает, что эти функции не изменяют состояния класса.
1
easybudda
Модератор
Эксперт CЭксперт С++
9714 / 5665 / 971
Регистрация: 25.07.2009
Сообщений: 10,910
19.12.2012, 03:07 #9
Цитата Сообщение от Serhiy_UA Посмотреть сообщение
В предыдущем коде меня интересует 9-тая строка, а именно
C++
1
    int value() const { return _val; }
Почему здесь стоит служебное слово const ?
Я знаю, что без него программа работать не будет. Я хочу знать, согласно какого правила так надо писать. Тыкните меня носом, пожалуйста.
Посмотрите, как передаются параметры в функции в 13 и 18 строке - как ссылки на константные объекты. Компилятор не проверяет, что на самом деле происходит внутри методов класса при вызове их из функции, но раз уж переданный по ссылке объект класса не должен изменяться, должна быть гарантия, что вызываемые внутри функции методы не изменят сам объект. Что, как уже верно заметили, и достигается объявлением метода, как константного. В качестве эксперимента попробуйте внутри константного метода как-нибудь изменить переменную, значение которой он возвращает. Оно, конечно, снова не скомпилируется (не должно бы по крайней мере), но прочитать сообщение об ошибке в этом случае тоже будет полезно...
1
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
19.12.2012, 14:19 #10
Цитата Сообщение от David Sylva Посмотреть сообщение
Слово const после круглых скобок в объявление(определение ) функции, означает, что эти функции не изменяют состояния класса.
Угу, только вот поля помеченные как mutable могут меняться. А вообще он написан для константных объектов. Уберите слово const и увидите error`ы.
1
19.12.2012, 14:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 14:19
Привет! Вот еще темы с ответами:

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

Перегрузка оператора [] - C++
Что не правильно я перегрузил? #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; struct S_List { char c; S_List...

Перегрузка оператора - C++
Доброго всем времени. пытаюсь написать свой класс надстройка на одномерный массив. У меня вот возникло затруднение с перегрузками...

Перегрузка оператора << - C++
Здравствуйте форумчане, помогите исправить ошибку. Вообщем есть класс с перегруженным оператором &lt;&lt; . Category.h class...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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