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

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

Восстановить пароль Регистрация
 
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
06.01.2010, 16:43     Перегрузка опереторов для пользовательских класов #1
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++ Обработка исключений в классах для пользовательских типов
C++ Использование потокового итератора для пользовательских обьектов
Составить программу для умножения дроби на дробь с использованием пользовательских функций C++
C++ Перегрузка оператора "<<" для вывода пользовательских классов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gravity
 Аватар для Gravity
555 / 549 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.01.2010, 16:45     Перегрузка опереторов для пользовательских класов #2
friend int operator+(T a, T b)
"+" - опечатка?
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
06.01.2010, 16:55  [ТС]     Перегрузка опереторов для пользовательских класов #3
все, нашел,
C++
1
friend int operator-(T a, T b)  {   return (a.inf - b.inf); }
я здесь + место - поставил))

Добавлено через 8 минут
я почему за перегрузку всялся: с стек приятней добавлять елементы используя "+="
тему пожалуй можно, закрыть, только еще один вопрос: как перегрузить преинкрументные и постинкрементные операторы?
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1330 / 863 / 50
Регистрация: 02.01.2009
Сообщений: 2,621
Записей в блоге: 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║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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
 Аватар для Gravity
555 / 549 / 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║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
21.03.2010, 00:18  [ТС]     Перегрузка опереторов для пользовательских класов #10
за что он будет отвечать?
~(:{)Yura
0 / 0 / 0
Регистрация: 28.02.2010
Сообщений: 10
21.03.2010, 01:04     Перегрузка опереторов для пользовательских класов #11
за сравнения масивов оценок "==")))
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
21.03.2010, 08:17  [ТС]     Перегрузка опереторов для пользовательских класов #12
~(:{)Yura, Размеры масивов фиксированные, или это векора??
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2010, 11:12     Перегрузка опереторов для пользовательских класов
Еще ссылки по теме:

C++ Перегрузка операторов разных класов
Шаблон для пользовательских типов данных C++
Возможно ли переопределение операторов для пользовательских типов? C++

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

Или воспользуйтесь поиском по форуму:
~(:{)Yura
0 / 0 / 0
Регистрация: 28.02.2010
Сообщений: 10
21.03.2010, 11:12     Перегрузка опереторов для пользовательских класов #13
фиксированые
Yandex
Объявления
21.03.2010, 11:12     Перегрузка опереторов для пользовательских класов
Ответ Создать тему
Опции темы

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