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

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

Войти
Регистрация
Восстановить пароль
 
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
#1

Перегрузка опереторов для пользовательских класов - C++

06.01.2010, 16:43. Просмотров 687. Ответов 12
Метки нет (Все метки)

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
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
#include <windows.h>
 
using namespace std;
 
class T
{
public:
    T(int n){inf = n;}
    ~T(){}
    friend bool operator==(T a, T b)
    {
        return (a.inf == b.inf);
    }
    friend int operator+(T a, T b)
    {
        return (a.inf - b.inf);
    }
private:
    int inf;
};
 
int main()
{
    int a;
    cin >> a;
    T A1(a);
    cin >> a;
    T A2(a);
    cout << ((A1 == A2) ? ('1') : ('0')) << " " << A1 - A2) << " " << (A2 - A1) << endl;
    getchar();getchar();
    return 0;
}
Сравнение работает, а вот на отнимание выдает следующее:
35 C:\Documents and Settings\Администратор\Рабочий стол\help.cpp no match for 'operator-' in 'A1 - A2'
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2010, 16:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка опереторов для пользовательских класов (C++):

Перегрузка операторов разных класов - C++
здравствуйте уважаемые форумчане начал программировать класс полиномов и начал я перегружать оператор * для разных классов friend...

Перегрузка оператора "<<" для вывода пользовательских классов - C++
Всем доброго времени суток. Пытаюсь сделать перегрузку оператора &quot;&lt;&lt;&quot; для того, чтобы можно было выводить объекты пользовательского класса...

Шаблон для пользовательских типов данных - C++
В общем имееются две функции. Одна принимает тип данных string другая char. Функции выполняют одну и ту же задачу. Вопрос как сделать...

Обработка исключений в классах для пользовательских типов - C++
Здорова господа! Запустил токо класс String тестю и тут у меня вылетело исключение выход за пределы индекса, и программа тупо аварийно...

Возможно ли переопределение операторов для пользовательских типов? - C++
Собственно преследуемая цель: Определить свой тип int - myint. Переопределить для него операторы как надо. Ну, например, надо мне при...

Использование потокового итератора для пользовательских обьектов - C++
Надо с помощю итератора ofstream_iterator вывести содержимое множины, в которой есть обьекты пользовательського типа. Вот что я пока...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.01.2010, 16:45 #2
friend int operator+(T a, T b)
"+" - опечатка?
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
06.01.2010, 16:55  [ТС] #3
все, нашел,
C++
1
friend int operator-(T a, T b)  {   return (a.inf - b.inf); }
я здесь + место - поставил))

Добавлено через 8 минут
я почему за перегрузку всялся: с стек приятней добавлять елементы используя "+="
тему пожалуй можно, закрыть, только еще один вопрос: как перегрузить преинкрументные и постинкрементные операторы?
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
06.01.2010, 17:04 #4
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
#include <iostream>
 
using namespace std;
 
class T
{
    friend bool operator == (const T &a,const T &b);
    friend int operator - (const T &a,const T &b);
    friend ostream &operator << (ostream &s, const T &a);
public:
    T(int n){inf = n;}
    ~T(){}
 
    T &operator ++ (){
        ++inf;
        return *this;
    }
 
    T operator ++ (int){
        T buff = *this;
        ++inf;
        return buff;
    }
private:
    int inf;
};
 
bool operator == (const T &a,const T &b)
{
    return (a.inf == b.inf);
}
int operator - (const T &a,const T &b)
{
    return (a.inf - b.inf);
}
 
ostream &operator << (ostream &s, const T &a){
    return s << a.inf;
}
 
int main()
{
    T a(10);
    cout << ++a << endl;
    cout << a++ << endl;
    cout << a << endl;
    return 0;
}
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
06.01.2010, 17:07  [ТС] #5
вот вроде вышло сделать префиксную инткементацию, но она должна изменять само значение в класе, а при выводе значения оно остается тем же..
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
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
#include <windows.h>
 
using namespace std;
 
class T
{
public:
    T(int n){inf = n;}
    ~T(){}
    friend bool operator ==(T a, T b){   return (a.inf == b.inf);    }
    friend bool operator !=(T a, T b){   return (a.inf != b.inf);    }
    friend bool operator > (T a, T b){   return (a.inf > b.inf);     }
    friend bool operator < (T a, T b){   return (a.inf < b.inf);     }
    friend bool operator <=(T a, T b){   return (a.inf <= b.inf);    }
    friend bool operator >=(T a, T b){   return (a.inf >= b.inf);    }
    friend int operator -  (T a, T b){   return (a.inf - b.inf);     }
    friend int operator +  (T a, T b){   return (a.inf + b.inf);     }
    friend int operator ++ (T a)     {   return (a.inf = a.inf + 1); }
    friend int operator !  (T a)     {   return a.inf;               }
private:
    int inf;
};
 
int main()
{
    int a;
    cin >> a;
    T A1(a);
    cin >> a;
    T A2(a);
    cout << ((A1 >= A2) ? ("Yes") : ("No")) << " " << (A1 - A2) << " " << (++A2) << ":" << (!A2) << endl;
    getchar();getchar();
    return 0;
}
GRANDEATH
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
06.01.2010, 17:51 #6
А разве по умолчанию не постфикная форма перегружается?


Различные языки по-разному решают приведённые вопросы. Так, в C++ приоритет и ассоциативность перегруженных версий операций сохраняются такими же, как и у определённых в языке, а описания перегрузки префиксной и постфиксной формы операторов инкремента и декремента используют различные сигнатуры:
Префиксная форма Постфиксная форма
Функция T &operator ++(T &) T operator ++(T &, int)
Функция-член T &T::operator ++() T T::operator ++(int)

friend int &operator ! (T a) { return a.inf; } - так вроде все работает)

Кстати, ты бы отделял интерфейс класса от реализации. Конечно в таких функциях это только мешать будет, но надо
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
06.01.2010, 21:18  [ТС] #7
Цитата Сообщение от GRANDEATH Посмотреть сообщение
Кстати, ты бы отделял интерфейс класса от реализации. Конечно в таких функциях это только мешать будет, но надо
я лично не пойму зачем надо отделать? если клас не малый получается а код и так большой решается очень просто: создаём заголовочный файл и все ок, поимаю, если там функция на 2-3 екрана, тогда - да, не плохо бы ее вне описать, а так зачем?
лично меня это только запутывает..

Добавлено через 6 минут
ISergey, можете обьснить почему преимущественно использовать
C++
1
int operator - (const T &a,const T &b)
констатны вместо простых
C++
1
int operator - (T a, T b)
и зачем здесь ссылки, это типа константные ссылки получается, само значение менять можно а ссылку нельзя? так что-ли..
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.01.2010, 22:30 #8
const ставят для того, чтобы предупредить нежелательное изменение переменной, а ссылки чисто для быстроты доступа к данным (хотя в таком примере это не принципиально).
~(:{)Yura
0 / 0 / 0
Регистрация: 28.02.2010
Сообщений: 10
20.03.2010, 23:05 #9
а как перегрузить оператор :=???
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.03.2010, 00:18  [ТС] #10
за что он будет отвечать?
~(:{)Yura
0 / 0 / 0
Регистрация: 28.02.2010
Сообщений: 10
21.03.2010, 01:04 #11
за сравнения масивов оценок "==")))
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.03.2010, 08:17  [ТС] #12
~(:{)Yura, Размеры масивов фиксированные, или это векора??
~(:{)Yura
0 / 0 / 0
Регистрация: 28.02.2010
Сообщений: 10
21.03.2010, 11:12 #13
фиксированые
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2010, 11:12
Привет! Вот еще темы с ответами:

Составить программу для умножения дроби на дробь с использованием пользовательских функций - C++
Помогите пожалуйста!) Даны две дроби A/B и C/D (A, B, C, D – натуральные числа). Составить программу для умножения дроби на дробь....

Как дать доступ к разделенной памяти для пользовательских программ из сервиса - C++
У меня такая проблема, при запуске компьютера стартует сервис с правами SYSTEM. Этот сервис создает разделенную память и помещает в нее...

Наследование класов - C++
Классы для меня в целом очень сложно даются, мне очень нужна данная прога так как все последующие лабораторные будут с ней связаны,...

наследование класов - C++
Напишите пожалуйста ету програму, а то я никак немогу разобратся с наследованием. Создать класс колесо, имеющее радиус. Определить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.03.2010, 11:12
Ответ Создать тему
Опции темы

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