Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
wrone
8 / 8 / 2
Регистрация: 19.12.2013
Сообщений: 87
#1

Шаблон класса и перегрузка операторов - C++

09.11.2014, 16:33. Просмотров 558. Ответов 2
Метки нет (Все метки)

Есть класс, вроде бы все сделано правильно, все как надо работает

Вот собственно рабочий код:
Кликните здесь для просмотра всего текста

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream>
#include <cmath>
 
using namespace std;
 
class MyVector{
 private:
    int *telpa;
    int garums;
 public:
    MyVector()
    {
        garums = 1;
        telpa = new int[garums];
        telpa[0] = 0;
    }
    MyVector(int garums)
    {
       this->garums = garums;
       telpa = new int[this->garums];
       for(int i = 0; i < this->garums; i++)
           telpa[i] = 0;
    }
    MyVector(int *sakums, int *beigas)
    {
        garums = beigas - sakums;
        telpa = new int[garums];
            for(int i = 0; i < this->garums; i++)
                telpa[i] = sakums[i];
    }
    MyVector(const MyVector &mv)
    {
        this->garums = mv.garums;
        telpa = new int[this->garums];
            for(int i = 0; i < this->garums; i++)
                telpa[i] = mv.telpa[i];
    }
    ~MyVector()
    {
        delete[] telpa;
    }
    MyVector &operator =(const MyVector &mv)
    {
        if(this != &mv)
        {
            delete[] telpa;
            this->garums = mv.garums;
            telpa = new int[this->garums];
                for(int i = 0; i < this->garums; i++)
                    telpa[i] = mv.telpa[i];
        }
        return *this;
    }
 
 
    double mod()
    {
        int sum = 0;
        for(int i = 0; i < garums; i++)
            sum += telpa[i] * telpa[i];
 
        return sqrt(sum);
    }
    void output()
    {
        for(int i = 0; i < garums; i++)
            cout << telpa[i] << " ";
 
        cout << endl;
    }
 
    friend MyVector &operator +(MyVector mv1, const MyVector &mv2);
    friend MyVector &operator -(MyVector mv1, const MyVector &mv2);
    friend MyVector &operator *(MyVector mv1, const int &sk);
    friend MyVector &operator *(MyVector mv1, const MyVector &mv2);
};
 
    MyVector &operator +(MyVector mv1, const MyVector &mv2)
    {
        if(mv1.garums != mv2.garums)
           throw -1;
        else
        {
           for(int i = 0; i < mv1.garums; i++)
           {
               mv1.telpa[i] += mv2.telpa[i];
           }
           return mv1;
        }
    }
    MyVector &operator -(MyVector mv1, const MyVector &mv2)
    {
        if(mv1.garums != mv2.garums)
           throw -1;
        else
        {
           for(int i = 0; i < mv1.garums; i++)
           {
               mv1.telpa[i] -= mv2.telpa[i];
           }
           return mv1;
        }
    }
    MyVector &operator *(MyVector mv1, const int &sk)
    {
          for(int i = 0; i < mv1.garums; i++)
              mv1.telpa[i] *= sk;
 
          return mv1;
    }
    MyVector &operator *(MyVector mv1, const MyVector &mv2)
    {
        if(mv1.garums != mv2.garums)
           throw -1;
        else
        {
           for(int i = 0; i < mv1.garums; i++)
               mv1.telpa[i] *= mv2.telpa[i];
 
           return mv1;
        }
    }
 
int main(){
 
 
 
    int arr[] = {5, 7, 11, 22, 88, 133};
    int arr2[] = {22, 45, 65, 1, 2, 3};
    MyVector mv(arr, arr + 6);
 
    MyVector mv3(arr2, arr2 + 6);
    mv3 = mv3;
 
    mv.output();
 
    mv3.output();
    cout << endl;
 
 
      MyVector mv2(mv);
 
      mv2 = mv + mv3;
      cout << " +  ";
      mv2.output();
 
 
 
return 0;
}


Теперь из этого класса нужно сделать шаблон. Проблема возникла с перегрузкой операторов. Показывает на 75 строчку, error: declaration of 'operator*' as non-function

Вот код, с которым возникли проблемы:
Кликните здесь для просмотра всего текста
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include <iostream>
#include <cmath>
 
using namespace std;
 
template <class Type>
class MyVector{
 private:
    Type *telpa;
    int garums;
 public:
    MyVector()
    {
        garums = 1;
        telpa = new int[garums];
        telpa[0] = 0;
    }
    MyVector(int garums)
    {
       this->garums = garums;
       telpa = new int[this->garums];
       for(int i = 0; i < this->garums; i++)
           telpa[i] = 0;
    }
    MyVector(Type *sakums, Type *beigas)
    {
        garums = beigas - sakums;
        telpa = new Type[garums];
            for(int i = 0; i < this->garums; i++)
                telpa[i] = sakums[i];
    }
    MyVector(const MyVector<Type> &mv)
    {
        this->garums = mv.garums;
        telpa = new int[this->garums];
            for(int i = 0; i < this->garums; i++)
                telpa[i] = mv.telpa[i];
    }
    ~MyVector()
    {
        delete[] telpa;
    }
    MyVector &operator =(const MyVector<Type> &mv)
    {
        if(this != &mv)
        {
            delete[] telpa;
            this->garums = mv.garums;
            telpa = new int[this->garums];
                for(int i = 0; i < this->garums; i++)
                    telpa[i] = mv.telpa[i];
        }
        return *this;
    }
 
 
    double mod()
    {
        int sum = 0;
        for(int i = 0; i < garums; i++)
            sum += telpa[i] * telpa[i];
 
        return sqrt(sum);
    }
    void output()
    {
        for(int i = 0; i < garums; i++)
            cout << telpa[i] << " ";
 
        cout << endl;
    }
 
    friend MyVector<Type> &operator + <>(MyVector<Type> mv1, const MyVector<Type> &mv2);
    friend MyVector<Type> &operator - <>(MyVector<Type> mv1, const MyVector<Type> &mv2);
    friend MyVector<Type> &operator * <>(MyVector<Type> mv1, const Type &sk);
    friend MyVector<Type> &operator * <>(MyVector<Type> mv1, const MyVector<Type> &mv2);
 
};
 
    template <class Type>
    MyVector<Type> &operator +(MyVector<Type> mv1, const MyVector<Type> &mv2)
    {
        if(mv1.garums != mv2.garums)
           throw -1;
        else
        {
           for(int i = 0; i < mv1.garums; i++)
           {
               mv1.telpa[i] += mv2.telpa[i];
           }
           return mv1;
        }
    }
    template <class Type>
    MyVector<Type> &operator -(MyVector<Type> mv1, const MyVector<Type> &mv2)
    {
        if(mv1.garums != mv2.garums)
           throw -1;
        else
        {
           for(int i = 0; i < mv1.garums; i++)
           {
               mv1.telpa[i] -= mv2.telpa[i];
           }
           return mv1;
        }
    }
    template <class Type>
    MyVector<Type> &operator *(MyVector<Type> mv1, const Type &sk)
    {
          for(int i = 0; i < mv1.garums; i++)
              mv1.telpa[i] *= sk;
 
          return mv1;
    }
    template <class Type>
    MyVector<Type> &operator *(MyVector<Type> mv1, const MyVector<Type> &mv2)
    {
        if(mv1.garums != mv2.garums)
           throw -1;
        else
        {
           for(int i = 0; i < mv1.garums; i++)
               mv1.telpa[i] *= mv2.telpa[i];
 
           return mv1;
        }
    }
 
 
 
 
 
int main(){
 
 
    int arr[] = {5, 7, 11, 22, 88, 133};
    int arr2[] = {22, 45, 65, 1, 2, 3};
    MyVector<int> mv(arr, arr + 6);
   // MyVector mv2(mv);
    MyVector<int> mv3(arr2, arr2 + 6);
    mv3 = mv3;
 
    mv.output();
   // mv2.output();
    mv3.output();
    cout << endl;
 
    /*mv3 = mv;
    mv3.output();
 
    cout << mv.mod();
*/
 
      MyVector<int> mv2(mv);
 
      mv2 = mv + mv3;
      cout << " +  ";
      mv2.output();
 
      mv2 = mv3 - mv;
      cout << " -  ";
      mv2.output();
 
      cout << "================" << endl;
      cout << "vektors * skaitlis" << endl;
 
      mv2 = mv2 * -1;
      mv2.output();
 
      cout << "================" << endl;
      cout << "skalarais reizinajums: " << endl;
      mv2.output();
      mv.output();
      cout << endl;
      mv = mv * mv2;
      mv.output();
 
 
 
return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2014, 16:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблон класса и перегрузка операторов (C++):

Перегрузка операторов класса - C++
Господа, сразу перейду к делу. Написал класс, но не могу перегрузить операторы &quot;&gt;&gt;&quot; и &quot;+&quot;. Не подскажете, что я делаю не так? Заранее...

Перегрузка операторов класса время - C++
Не могу сообразить как перегрузить операторы +,-,+=,-= и = для класса время. Нужно это как-то реализовать с учетом, что 60 секунд = минута...

Перегрузка операторов для класса - C++
class A { private: size_t i; public: size_t i_get() { return i; } };

Перегрузка операторов класса String - C++
Срочно нужна помощь. Реализовать класс String для работы со строками символов. Перегрузить операторы «=», «+=» так, чтобы производилось...

Перегрузка операторов в шаблоне класса - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;typeinfo&gt; #include &lt;windows.h&gt; using namespace std; template &lt;class Type1,...

Перегрузка операторов класса String - C++
Помогите сделать: Создать класс строка Stroka. Перегрузить операторы: 1) ! как унарный метод класса, проверяющий наличие символов в...

2
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
09.11.2014, 17:25 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include <iostream>
#include <cmath>
 
using namespace std;
 
template <class Type>
class MyVector{
 private:
    Type *telpa;
    int garums;
 public:
    MyVector()
    {
        garums = 1;
        telpa = new int[garums];
        telpa[0] = 0;
    }
    MyVector(int garums)
    {
       this->garums = garums;
       telpa = new int[this->garums];
       for(int i = 0; i < this->garums; i++)
           telpa[i] = 0;
    }
    MyVector(Type *sakums, Type *beigas)
    {
        garums = beigas - sakums;
        telpa = new Type[garums];
            for(int i = 0; i < this->garums; i++)
                telpa[i] = sakums[i];
    }
    MyVector(const MyVector<Type> &mv)
    {
        this->garums = mv.garums;
        telpa = new int[this->garums];
            for(int i = 0; i < this->garums; i++)
                telpa[i] = mv.telpa[i];
    }
    ~MyVector()
    {
        delete[] telpa;
    }
    MyVector &operator =(const MyVector<Type> &mv)
    {
        if(this != &mv)
        {
            delete[] telpa;
            this->garums = mv.garums;
            telpa = new int[this->garums];
                for(int i = 0; i < this->garums; i++)
                    telpa[i] = mv.telpa[i];
        }
        return *this;
    }
 
 
    double mod()
    {
        int sum = 0;
        for(int i = 0; i < garums; i++)
            sum += telpa[i] * telpa[i];
 
        return sqrt(sum);
    }
    void output()
    {
        for(int i = 0; i < garums; i++)
            cout << telpa[i] << " ";
 
        cout << endl;
    }
 
    template <class T>
    friend MyVector<T> &operator + (MyVector<T> mv1, const MyVector<T> &mv2);
    template <class T>
    friend MyVector<T> &operator - (MyVector<T> mv1, const MyVector<T> &mv2);
    template <class T>
    friend MyVector<T> &operator * (MyVector<T> mv1, const T &sk);
    template <class T>
    friend MyVector<T> &operator * (MyVector<T> mv1, const MyVector<T> &mv2);
 
};
 
    template <class Type>
    MyVector<Type> &operator +(MyVector<Type> mv1, const MyVector<Type> &mv2)
    {
        if(mv1.garums != mv2.garums)
           throw -1;
        else
        {
           for(int i = 0; i < mv1.garums; i++)
           {
               mv1.telpa[i] += mv2.telpa[i];
           }
           return mv1;
        }
    }
    template <class Type>
    MyVector<Type> &operator -(MyVector<Type> mv1, const MyVector<Type> &mv2)
    {
        if(mv1.garums != mv2.garums)
           throw -1;
        else
        {
           for(int i = 0; i < mv1.garums; i++)
           {
               mv1.telpa[i] -= mv2.telpa[i];
           }
           return mv1;
        }
    }
    template <class Type>
    MyVector<Type> &operator *(MyVector<Type> mv1, const Type &sk)
    {
          for(int i = 0; i < mv1.garums; i++)
              mv1.telpa[i] *= sk;
 
          return mv1;
    }
    template <class Type>
    MyVector<Type> &operator *(MyVector<Type> mv1, const MyVector<Type> &mv2)
    {
        if(mv1.garums != mv2.garums)
           throw -1;
        else
        {
           for(int i = 0; i < mv1.garums; i++)
               mv1.telpa[i] *= mv2.telpa[i];
 
           return mv1;
        }
    }
 
 
 
 
 
int main(){
 
 
    int arr[] = {5, 7, 11, 22, 88, 133};
    int arr2[] = {22, 45, 65, 1, 2, 3};
    MyVector<int> mv(arr, arr + 6);
   // MyVector mv2(mv);
    MyVector<int> mv3(arr2, arr2 + 6);
    mv3 = mv3;
 
    mv.output();
   // mv2.output();
    mv3.output();
    cout << endl;
 
    /*mv3 = mv;
    mv3.output();
 
    cout << mv.mod();
*/
 
      MyVector<int> mv2(mv);
 
      mv2 = mv + mv3;
      cout << " +  ";
      mv2.output();
 
      mv2 = mv3 - mv;
      cout << " -  ";
      mv2.output();
 
      cout << "================" << endl;
      cout << "vektors * skaitlis" << endl;
 
      mv2 = mv2 * -1;
      mv2.output();
 
      cout << "================" << endl;
      cout << "skalarais reizinajums: " << endl;
      mv2.output();
      mv.output();
      cout << endl;
      mv = mv * mv2;
      mv.output();
 
 
 
return 0;
}
1
wrone
8 / 8 / 2
Регистрация: 19.12.2013
Сообщений: 87
09.11.2014, 17:51  [ТС] #3
Так, теперь понятно где я допустил ошибки, исправил свой код, работает. Еще вопросик возник, вот в твоем коде 73, 75, 77, 79 строчки, template <class T>. А ниже, там где идет дефиниция этих функций, уже template <class Type>. То есть сверху T а ниже уже Type. Не должны ли там быть одинаковые параметры? Хотя так и так работает
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2014, 17:51
Привет! Вот еще темы с ответами:

Перегрузка кода в перегрузке операторов класса - C++
Добрый день, уважаемые знатоки языка C++. Решил создать тип данных для работы с денежными значениями. У меня есть оператор (например...

Перегрузка операторов для класса polynom - C++
Создаю класс полиномов (polynom), в нём надо перегрузить ряд операторов. Где-то нашёл пример, где оператор сложения перегружается так: ...

Перегрузка операторов для класса матриц - C++
Собственно, суть проблемы. Пишу класс матриц (хочется), оператор присваивания работает только тогда, когда функция (ну или, например,...

Перегрузка операторов для класса МАССИВ - C++
Привет. Есть класс &quot;вектор&quot; (&quot;массив&quot;), нужно переопределить операторы =, +, - , *, +=, -=, *= с целым числом. =, +=, -=, *=, как...


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

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

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