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

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

Войти
Регистрация
Восстановить пароль
 
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 293
#1

см. объявление "std::operator +" - C++

21.09.2013, 17:09. Просмотров 711. Ответов 15
Метки нет (Все метки)

Что-то не могу понять что не так в operator+.
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <iterator>
 
 
using namespace std;
 
const int size=10;
 
class Money{
    friend ostream &operator<<(ostream&out, const Money M){
        out<<M.m;
        return out;
    }
public:
    int m;
public:
    Money() : m(0){}
    Money(int a) : m(a){}
    bool operator<(Money M){
        return m < M.m;
    }
    bool operator>(Money &M){
        return m > M.m;
    }
    Money& operator+(Money &M){
        Money tmp;
        tmp.m = M.m + m;
        return tmp;
    }
    Money& operator++(){
        m++;
        return *this;
    }
    Money& operator++(int){
        m++;
        return *this;
    }
    bool operator==(Money src){
        return (m == src.m);
    }
    Money& operator=(Money M){
        m = M.m;
        return *this;
    }
};
 
 
class Sum{
    
private:
    double sum;
public:
    Sum(double s) : sum(s){}
    void operator()(Money &x){
        x.m += sum;
    }
};
 
 
int main(){
    
    vector <Money> money;
 
    for(int i=0;i<size;i++)
        money.push_back(Money(rand()%10));
    cout<<"You array: ";
    copy(money.begin(),money.end(),ostream_iterator <Money>(cout, " " ));
    cout<<endl;
    vector<Money>::iterator max = max_element(money.begin(),money.end());
    cout<<"Max element: "<<*max<<endl;
    money.insert(money.begin(),*max);
    vector<Money>::iterator min = min_element(money.begin(),money.end());
    cout<<"Max element: "<<*min<<endl;
    money.erase(min);
    double sum=accumulate(money.begin(), money.end(),0)/money.size();
    cout<<"Suma/size(): "<<sum<<endl;
    for_each(money.begin(),money.end(),Sum(sum));
    cout<<"Array after replacing: ";
    copy(money.begin(),money.end(),ostream_iterator <Money>(cout, " " ));
    
    system("pause>0");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.09.2013, 17:12     см. объявление "std::operator +" #2
и где этот оператор + ?
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 293
21.09.2013, 17:13  [ТС]     см. объявление "std::operator +" #3
Цитата Сообщение от Jupiter Посмотреть сообщение
и где этот оператор + ?
C++
1
2
3
4
5
Money& operator+(Money &M){
        Money tmp;
        tmp.m = M.m + m;
        return tmp;
    }
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.09.2013, 17:14     см. объявление "std::operator +" #4
ты возвращаешь ссылку на локальную переменную, оператор+ должен возвращать копию
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,164
Завершенные тесты: 2
21.09.2013, 17:15     см. объявление "std::operator +" #5
Цитата Сообщение от Insane__ Посмотреть сообщение
Money& operator++(){
* * * * m++;
* * * * return *this;
* * }
* * Money& operator++(int){
* * * * m++;
* * * * return *this;
* * }
тут тоже ошибка
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 293
21.09.2013, 17:18  [ТС]     см. объявление "std::operator +" #6
Цитата Сообщение от Кудаив Посмотреть сообщение
тут тоже ошибка
Я знаю, что там нужно возвращать копию а не оригинал.
Цитата Сообщение от Jupiter Посмотреть сообщение
ты возвращаешь ссылку на локальную переменную, оператор+ должен возвращать копию
Возвращаю копию, но ошибок меньше не становится.
Кликните здесь для просмотра всего текста
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
1>------ Построение начато: проект: lab1, Конфигурация: Debug Win32 ------
1>Построение начато 21.09.2013 16:15:26.
1>InitializeBuildStatus:
1>  Обращение к "Debug\lab1.unsuccessfulbuild".
1>ClCompile:
1>  main.cpp
1>c:\users\андрей\documents\visual studio 2010\projects\lab1\lab1\main.cpp(58): warning C4244: +=: преобразование "double" в "int", возможна потеря данных
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::move_iterator<_RanIt> std::operator +(_Diff,const std::move_iterator<_RanIt> &): не удалось вывести аргумент шаблон для "const std::move_iterator<_RanIt> &" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\iterator(336): см. объявление "std::operator +"
1>          c:\program files\microsoft visual studio 10.0\vc\include\numeric(26): см. ссылку на создание экземпляров функции шаблон при компиляции "_Ty std::_Accumulate<Money*,_Ty>(_InIt,_InIt,_Ty)"
1>          with
1>          [
1>              _Ty=int,
1>              _InIt=Money *
1>          ]
1>          c:\users\андрей\documents\visual studio 2010\projects\lab1\lab1\main.cpp(78): см. ссылку на создание экземпляров функции шаблон при компиляции "_Ty std::accumulate<std::_Vector_iterator<_Myvec>,int>(_InIt,_InIt,_Ty)"
1>          with
1>          [
1>              _Ty=int,
1>              _Myvec=std::_Vector_val<Money,std::allocator<Money>>,
1>              _InIt=std::_Vector_iterator<std::_Vector_val<Money,std::allocator<Money>>>
1>          ]
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Vb_iterator<_Alloc> std::operator +(_Alloc::difference_type,std::_Vb_iterator<_Alloc>): не удалось вывести аргумент шаблон для "std::_Vb_iterator<_Alloc>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\vector(1985): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Vb_const_iterator<_Alloc> std::operator +(_Alloc::difference_type,std::_Vb_const_iterator<_Alloc>): не удалось вывести аргумент шаблон для "std::_Vb_const_iterator<_Alloc>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\vector(1878): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Vector_iterator<_Myvec> std::operator +(_Vector_iterator<_Myvec>::difference_type,std::_Vector_iterator<_Myvec>): не удалось вывести аргумент шаблон для "std::_Vector_iterator<_Myvec>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\vector(407): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Vector_const_iterator<_Myvec> std::operator +(_Vector_const_iterator<_Myvec>::difference_type,std::_Vector_const_iterator<_Myvec>): не удалось вывести аргумент шаблон для "std::_Vector_const_iterator<_Myvec>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\vector(276): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_String_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_iterator<_Elem,_Traits,_Alloc>): не удалось вывести аргумент шаблон для "std::_String_iterator<_Elem,_Traits,_Alloc>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xstring(434): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_String_const_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_const_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_const_iterator<_Elem,_Traits,_Alloc>): не удалось вывести аргумент шаблон для "std::_String_const_iterator<_Elem,_Traits,_Alloc>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xstring(293): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Array_iterator<_Ty,_Size> std::operator +(_Array_iterator<_Ty,_Size>::difference_type,std::_Array_iterator<_Ty,_Size>): не удалось вывести аргумент шаблон для "std::_Array_iterator<_Ty,_Size>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xutility(2068): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Array_const_iterator<_Ty,_Size> std::operator +(_Array_const_iterator<_Ty,_Size>::difference_type,std::_Array_const_iterator<_Ty,_Size>): не удалось вывести аргумент шаблон для "std::_Array_const_iterator<_Ty,_Size>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xutility(1929): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::reverse_iterator<_RanIt> std::operator +(_Diff,const std::reverse_iterator<_RanIt> &): не удалось вывести аргумент шаблон для "const std::reverse_iterator<_RanIt> &" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xutility(1323): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Revranit<_RanIt,_Base> std::operator +(_Diff,const std::_Revranit<_RanIt,_Base> &): не удалось вывести аргумент шаблон для "const std::_Revranit<_RanIt,_Base> &" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xutility(1136): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2677: бинарный "+": не найден глобальный оператор, принимающий тип "Money" (или приемлемое преобразование отсутствует)
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:00.95
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,164
Завершенные тесты: 2
21.09.2013, 17:23     см. объявление "std::operator +" #7
Цитата Сообщение от Insane__ Посмотреть сообщение
Я знаю, что там нужно возвращать копию а не оригинал.
да можно и оригинал возвращать, просто что префиксный, что постфиксный делают одно и то же
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
21.09.2013, 17:36     см. объявление "std::operator +" #8
C++
1
2
3
4
Money& operator+(Money &M){
    m += M.m;
    return *this;
}
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 18:14     см. объявление "std::operator +" #9
C++
1
2
3
4
5
6
7
int f(Money x, Money y)
{
    return x.m + y.m;
}
...
double sum = accumulate(money.begin(), money.end(), 0, f)/money.size();
...
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
21.09.2013, 19:11     см. объявление "std::operator +" #10
C++
1
2
3
4
5
6
7
8
9
    Money operator + ( const Money & M ) const {
        return Money( m + M.m );
    }
 
    ...
 
    Money a(1), b(2), c;
    c = a + b;
    cout << c.m << endl;
_, оператор + не должен изменять значения в своем классе.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,164
Завершенные тесты: 2
21.09.2013, 19:51     см. объявление "std::operator +" #11
Цитата Сообщение от castaway Посмотреть сообщение
оператор + не должен изменять значения в своем классе
все зависит от того какой смысл вкладывает программист в оператор
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
21.09.2013, 20:09     см. объявление "std::operator +" #12
Цитата Сообщение от Кудаив Посмотреть сообщение
все зависит от того какой смысл вкладывает программист в оператор
Я говорю про данный случай. Он же обычно общий.
gray_fox
21.09.2013, 20:11
  #13

Не по теме:

Цитата Сообщение от Кудаив Посмотреть сообщение
все зависит от того какой смысл вкладывает программист в оператор
Вот поэтому в некоторых языках и отказались от перегрузки операторов...

User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
21.09.2013, 20:13     см. объявление "std::operator +" #14
Цитата Сообщение от castaway Посмотреть сообщение
_, оператор + не должен изменять значения в своем классе.
согласен. я вот не подумал и написал по быстрому.

ведь когда пишем z = x + y, то x и y не изменяются
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 20:15     см. объявление "std::operator +" #15
Цитата Сообщение от Кудаив Посмотреть сообщение
все зависит от того какой смысл вкладывает программист в оператор
Хорошим стилем является, что оператор, перегруженный для класса, работает так же, как для встроенных типов.
Цитата Сообщение от _ Посмотреть сообщение
ведь когда пишем z = x + y, то x и y не изменяются
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 06:44     см. объявление "std::operator +"
Еще ссылки по теме:

C++ Создание перегрузки метода "operator =" для типа, расположенного в ином namespace
C++ Написать перегрузку operator+() для класса "Массив"
C++ Добавить целое число в очередь с помощью "operator <<"
Ошибка "binary '==': no operator found which takes a left-hand operand of type" C++
бинарный "operator <<" имеет слишком мало параметров С++ C++

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

Или воспользуйтесь поиском по форуму:
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,164
Завершенные тесты: 2
22.09.2013, 06:44     см. объявление "std::operator +" #16
Цитата Сообщение от alsav22 Посмотреть сообщение
как для встроенных типов

Не по теме:

таки я и не спорю - просто констатирую факт

Yandex
Объявления
22.09.2013, 06:44     см. объявление "std::operator +"
Ответ Создать тему
Опции темы

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