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

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

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

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

21.09.2013, 17:09. Просмотров 747. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2013, 17:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос см. объявление "std::operator +" (C++):

Ошибка на "cout <<" no match for operator operand types are std::basic_ostream char - C++
Немного слов про код.Данный код создан для выдачи номера машины,цвета,марки при предоставлении имени.Знаю,что код можно было написать проще...

Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" - C++
Здравствуйте. Предлагаю заняться арифметикой. Создал прослейший класс, перегрузил операторы сложения и умножения, в конструкторе...

Error C2664: Client::First: невозможно преобразовать параметр 1 из "std::queue<_Ty>" в "std::queue<_Ty> &" - C++
barbershop.h: #ifndef __BARBERSHOP_H__ #define __BARBERSHOP_H__ #include &lt;vector&gt; #include &lt;queue&gt; #include &quot;wantshaircut.h&quot; ...

Чем "operator *=" отличается от "operator *"? - C++
снова застряла, не могу понять, чем этот оператор должен отличаться от оператора*.....? вот он, но это работает только в случае...

C2678 бинарный ">>": не найден оператор, принимающий левый операнд типа "std::ostream" - C++
Код: #include &lt;iostream&gt; #include &lt;memory&gt; #include &lt;typeinfo&gt; #include &lt;ctime&gt; #include &lt;windows.h&gt; #include &lt;ostream&gt; ...

Error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" - C++
Вот ошибка 1&gt;------ Построение начато: проект: ыпошряоям, Конфигурация: Debug Win32 ------ 1&gt; файл.cpp 1&gt;c:\users\hp\desktop\уроки...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.09.2013, 17:12 #2
и где этот оператор + ?
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 293
21.09.2013, 17:13  [ТС] #3
Цитата Сообщение от Jupiter Посмотреть сообщение
и где этот оператор + ?
C++
1
2
3
4
5
Money& operator+(Money &M){
        Money tmp;
        tmp.m = M.m + m;
        return tmp;
    }
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.09.2013, 17:14 #4
ты возвращаешь ссылку на локальную переменную, оператор+ должен возвращать копию
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
21.09.2013, 17:15 #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  [ТС] #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,168
Завершенные тесты: 2
21.09.2013, 17:23 #7
Цитата Сообщение от Insane__ Посмотреть сообщение
Я знаю, что там нужно возвращать копию а не оригинал.
да можно и оригинал возвращать, просто что префиксный, что постфиксный делают одно и то же
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
21.09.2013, 17:36 #8
C++
1
2
3
4
Money& operator+(Money &M){
    m += M.m;
    return *this;
}
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 18:14 #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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.09.2013, 19:11 #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,168
Завершенные тесты: 2
21.09.2013, 19:51 #11
Цитата Сообщение от castaway Посмотреть сообщение
оператор + не должен изменять значения в своем классе
все зависит от того какой смысл вкладывает программист в оператор
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.09.2013, 20:09 #12
Цитата Сообщение от Кудаив Посмотреть сообщение
все зависит от того какой смысл вкладывает программист в оператор
Я говорю про данный случай. Он же обычно общий.
gray_fox
21.09.2013, 20:11
  #13

Не по теме:

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

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

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

error C2040: key: "int [256]" отличается по уровням косвенного обращения от "std::ofstream" - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; #include &lt;string&gt; using namespace std; #define size...

Error C2678: бинарный "<<": не найден оператор, принимающий левый операнд типа "std::ifstream" - C++
Собственно, текст ошибки приведен в названии темы. Сам код: #include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iomanip&gt; #include...

Бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" - C++
Подскажите, пожалуйста, как решить проблему. Хочу перегрузить оператор ввода, но никак не пойму, в чем дело #include&lt;iostream&gt; ...

Error C2440: <function-style-cast>: невозможно преобразовать "unsigned int" в "std::bitset<_Bits>" - C++
С++ Не работает программа! Задание было такое: напишите программу invert(p,x,n), возвращающую значение х с инвертированными n-битами,...


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

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

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