Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
║XLR8║
1105 / 852 / 256
Регистрация: 25.07.2009
Сообщений: 4,180
Записей в блоге: 5
1

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

06.01.2010, 16:43. Показов 782. Ответов 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'
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2010, 16:43
Ответы с готовыми решениями:

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

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

Составить запрос для коллекции класов содержащих в себе коллекцию других классов
Имеем коллекцию объектов типа ItemDefinition. Коллекция выглядит так: public List&lt;ItemDefinition&gt;...

Напишите код для декларации класов TBicolor, который будет представлять прямоугольник
У меня 3 задачи, что бы не резали глаза я разделю их на 3 темы. Вы не обижайтесь, я безобидный...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
12
576 / 570 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
06.01.2010, 16:45 2
friend int operator+(T a, T b)
"+" - опечатка?
1
║XLR8║
1105 / 852 / 256
Регистрация: 25.07.2009
Сообщений: 4,180
Записей в блоге: 5
06.01.2010, 16:55  [ТС] 3
все, нашел,
C++
1
friend int operator-(T a, T b)  {   return (a.inf - b.inf); }
я здесь + место - поставил))

Добавлено через 8 минут
я почему за перегрузку всялся: с стек приятней добавлять елементы используя "+="
тему пожалуй можно, закрыть, только еще один вопрос: как перегрузить преинкрументные и постинкрементные операторы?
0
Maniac
Эксперт С++
1454 / 955 / 159
Регистрация: 02.01.2009
Сообщений: 2,815
Записей в блоге: 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;
}
1
║XLR8║
1105 / 852 / 256
Регистрация: 25.07.2009
Сообщений: 4,180
Записей в блоге: 5
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;
}
0
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; } - так вроде все работает)

Кстати, ты бы отделял интерфейс класса от реализации. Конечно в таких функциях это только мешать будет, но надо
1
║XLR8║
1105 / 852 / 256
Регистрация: 25.07.2009
Сообщений: 4,180
Записей в блоге: 5
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)
и зачем здесь ссылки, это типа константные ссылки получается, само значение менять можно а ссылку нельзя? так что-ли..
0
576 / 570 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
06.01.2010, 22:30 8
const ставят для того, чтобы предупредить нежелательное изменение переменной, а ссылки чисто для быстроты доступа к данным (хотя в таком примере это не принципиально).
1
0 / 0 / 0
Регистрация: 28.02.2010
Сообщений: 10
20.03.2010, 23:05 9
а как перегрузить оператор :=???
0
║XLR8║
1105 / 852 / 256
Регистрация: 25.07.2009
Сообщений: 4,180
Записей в блоге: 5
21.03.2010, 00:18  [ТС] 10
за что он будет отвечать?
0
0 / 0 / 0
Регистрация: 28.02.2010
Сообщений: 10
21.03.2010, 01:04 11
за сравнения масивов оценок "==")))
0
║XLR8║
1105 / 852 / 256
Регистрация: 25.07.2009
Сообщений: 4,180
Записей в блоге: 5
21.03.2010, 08:17  [ТС] 12
~(:{)Yura, Размеры масивов фиксированные, или это векора??
0
0 / 0 / 0
Регистрация: 28.02.2010
Сообщений: 10
21.03.2010, 11:12 13
фиксированые
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2010, 11:12

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Синтаксис для создания маски для ввода пользовательских данных.
Пришла необходимость разбираться с JQuery итд. Я в этом полный нуб. $.mask = {//Predefined...

Привелегии для пользовательских ролей
- метода написана правда по 2005, вообщем не нашёл там вкладку привилегии, думал в том списке dbo,...

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

IDE для запуска пользовательских скриптов
Нужно чтобы пользователь мог запускать свои скрипты, состоящие просто из функций, вызываемых из мой...


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

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

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