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

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

Войти
Регистрация
Восстановить пароль
 
Omenjke
Сообщений: n/a
#1

Как переделать friend-перегрузки ввода/вывода в метод класса? - C++

07.05.2011, 00:54. Просмотров 721. Ответов 3
Метки нет (Все метки)

Доброго времени суток!
Есть вопрос: как переделать френдовые перегрузки ввода\вывода в метод класса?
Или же как шаблонить френдовые перегрузки?
Заранее спасибо.
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#include <iostream>
 
using namespace std;
 
class dmasiv
{
public :
dmasiv();
dmasiv (int x);
dmasiv (int s, int b);
dmasiv (dmasiv &c);
void creatData();
void getData();
dmasiv operator +(const dmasiv& k);
dmasiv& operator =(const dmasiv& q);
dmasiv operator -(const dmasiv& k);
dmasiv operator *(const dmasiv& k);
friend ostream& operator<<(ostream& s,const dmasiv& a) ;
friend istream& operator>>(istream& s,dmasiv& a);
~dmasiv();
protected:
int n, m;
int** a;
};
void dmasiv::creatData()
{
 
a = new int*[n];
for(int i=0;i<n;i++)
{
  a[i] = new int[m];
}
}
void dmasiv::getData()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cout<<"a["<<i<<"]["<<j<<"]="<<a[i][j]<<endl;
}
 
dmasiv::dmasiv()
{
n=1;
m=1;
a = new int*[n];
for(int i=0;i<n;i++)
{
  a[i] = new int[m];
}
for(int i=0;i<n; i++)
for (int j=0;j<m;j++)
a[0][0]=12;
}
 
dmasiv::dmasiv(int s ,int  b)
{
n=s;
m=b;
}
dmasiv::dmasiv(int x)
{
n=x;
m=x;
}
 
 
dmasiv::dmasiv(dmasiv &c)
{
n=c.n;
m=c.m;
a = new int*[n];
for(int i=0;i<n;i++)
{
  a[i] = new int[m];
}
for(int i=0;i<n; i++)
for (int j=0;j<m;j++)
a[i][j]=c.a[i][j];
}
dmasiv::~dmasiv()
{
for(int i = 0; i < n; i++)
delete[] a[i];
delete[] a;
}
dmasiv dmasiv::operator -(const dmasiv& k)
{
dmasiv q;
for(int i=0;i<n;i++)
delete [] q.a[i];
delete []q.a;
q.n=k.n;
q.m=k.m;
q.a=new int*[q.n];
for(int i=0 ; i<q.n ; i++)
q.a[i]=new int[q.m];
for(int i=0;i<q.n;i++)
for(int j=0;j<q.m;j++)
    {q.a[i][j]=0;}
for (int i=0 ; i<q.n ; i++)
for (int j=0 ; j<q.m ; j++)
q.a[i][j]=a[i][j]-k.a[i][j];
return q;
}
dmasiv dmasiv::operator *(const dmasiv& k)
{
dmasiv q;
for(int i=0;i<n;i++)
delete [] q.a[i];
delete []q.a;
q.n=k.n;
q.m=k.m;
q.a=new int*[q.n];
for(int i=0 ; i<q.n ; i++){
q.a[i]=new int[q.m];}
for(int i=0;i<q.n;i++)
for(int j=0;j<q.m;j++)
    {q.a[i][j]=0;}
for(int i=0;i<q.n;i++)
for(int j=0;j<q.m;j++)
q.a[i][j]=a[i][j]*k.a[i][j];
return q;
}
dmasiv dmasiv::operator +(const dmasiv& k)
{
int i, j;
dmasiv q;
q.n=k.n;
q.m=k.m;
for(i = 0; i < n; i++)
delete[] q.a[i];
delete[] q.a;
q.a=new int*[q.n];
for(i=0;i<n;i++)
q.a[i]=new int[q.m];
for(int i=0;i<q.n;i++)
for(int j=0;j<q.m;j++)
    {q.a[i][j]=0;}
for (i=0;i<q.n;i++)
for (j=0;j<q.m;j++)
q.a[i][j]=k.a[i][j]+a[i][j];
return q;
}
dmasiv& dmasiv::operator =(const dmasiv& q)
  {
    delete[] a;
    n=q.n;
    m=q.m;
    a=new int*[n];
    for(int i=0 ; i<n ; i++)
    a[i]=new int[m];
    for(int i=0; i<n; i++)
    for (int j=0;j<m;j++) a[i][j]=q.a[i][j];
    return *this;
  }
 
istream& operator>>(istream& s, dmasiv& q)
{
for(int i=0;i<q.n; i++)
for (int j=0;j<q.m;j++)
cin>>q.a[i][j];
      return s;
 
}
ostream& operator<<(ostream& s,const dmasiv& w)
{
for(int i=0;i<w.n; i++)
for (int j=0;j<w.m;j++)
 cout<<"a["<<i<<"]["<<j<<"]="<<w.a[i][j]<<endl;
 return (s);
}
 
int main()
{
int x, i;
dmasiv q;
cout<<"Input size of matrix."<<endl;
cout<<"For example 2 = 2x2"<<endl;
cin>>x;
dmasiv o(x);
dmasiv k(x);
o.creatData();
cout<<"Input element's of matrix O"<<endl;
cin>>o;
k.creatData();
cout<<"Input element's of matrix K"<<endl;
cin>>k;
cout<<" Menu"<<endl;
cout<<"1. Multiplication"<<endl;
cout<<"2. Sum"<<endl;
cout<<"3. Minus"<<endl;
cin>>i;
switch(i)
{
case 1:q = o * k;cout<<q<<endl;break;
case 2:q = o + k;cout<<q<<endl;break;
case 3:q = o - k;cout<<q<<endl;break;
default: cout<<"Incorect input"<<endl;break;
}
system("pause");
return 0;
}
Добавлено через 5 часов 57 минут
Можно закрывать, разобрался.
Вот код если вдруг кому то понадобится пример.
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#include <iostream>
 
using namespace std;
template <class Type>
class dmasiv
{
public :
dmasiv();
dmasiv (int x);
dmasiv (int s, int b);
dmasiv (dmasiv <Type>&c);
void creatData();
void setData();
void getData();
dmasiv operator +(const dmasiv<Type>& k);
dmasiv& operator =(const dmasiv<Type>& q);
dmasiv operator -(const dmasiv<Type>& k);
dmasiv operator *(const dmasiv<Type>& k);
~dmasiv();
protected:
int n, m;
Type** a;
};
template <class Type>
void dmasiv<Type>::setData()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
}
template <class Type>
void dmasiv<Type>::creatData()
{
 
a = new Type*[n];
for(int i=0;i<n;i++)
{
  a[i] = new Type[m];
}
}
template <class Type>
void dmasiv<Type>::getData()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cout<<"a["<<i<<"]["<<j<<"]="<<a[i][j]<<endl;
}
template <class Type>
dmasiv<Type>::dmasiv()
{
n=1;
m=1;
a = new Type*[n];
for(int i=0;i<n;i++)
{
  a[i] = new Type[m];
}
for(int i=0;i<n; i++)
for (int j=0;j<m;j++)
a[0][0]=12;
}
template <class Type>
dmasiv<Type>::dmasiv(int s ,int  b)
{
n=s;
m=b;
}
template <class Type>
dmasiv<Type>::dmasiv(int x)
{
n=x;
m=x;
}
template <class Type>
dmasiv<Type>::dmasiv(dmasiv<Type>&c)
{
n=c.n;
m=c.m;
a = new Type*[n];
for(int i=0;i<n;i++)
{
  a[i] = new Type[m];
}
for(int i=0;i<n; i++)
for (int j=0;j<m;j++)
a[i][j]=c.a[i][j];
}
template <class Type>dmasiv<Type>::~dmasiv()
{
for(int i = 0; i < n; i++)
delete[] a[i];
delete[] a;
}
template <class Type>
dmasiv<Type> dmasiv<Type>::operator -(const dmasiv<Type>& k)
{
dmasiv q;
for(int i=0;i<n;i++)
delete [] q.a[i];
delete []q.a;
q.n=k.n;
q.m=k.m;
q.a=new Type*[q.n];
for(int i=0 ; i<q.n ; i++)
q.a[i]=new Type[q.m];
for(int i=0;i<q.n;i++)
for(int j=0;j<q.m;j++)
    {q.a[i][j]=0;}
for (int i=0 ; i<q.n ; i++)
for (int j=0 ; j<q.m ; j++)
q.a[i][j]=a[i][j]-k.a[i][j];
return q;
}
template <class Type>
dmasiv<Type> dmasiv<Type>::operator *(const dmasiv<Type>& k)
{
dmasiv q;
for(int i=0;i<n;i++)
delete [] q.a[i];
delete []q.a;
q.n=k.n;
q.m=k.m;
q.a=new Type*[q.n];
for(int i=0 ; i<q.n ; i++){
q.a[i]=new Type[q.m];}
for(int i=0;i<q.n;i++)
for(int j=0;j<q.m;j++)
    {q.a[i][j]=0;}
for(int i=0;i<q.n;i++)
for(int j=0;j<q.m;j++)
q.a[i][j]=a[i][j]*k.a[i][j];
return q;
}
template <class Type>
dmasiv<Type> dmasiv<Type>::operator +(const dmasiv<Type>& k)
{
int i, j;
dmasiv q;
q.n=k.n;
q.m=k.m;
for(i = 0; i < n; i++)
delete[] q.a[i];
delete[] q.a;
q.a=new Type*[q.n];
for(i=0;i<n;i++)
q.a[i]=new Type[q.m];
for(int i=0;i<q.n;i++)
for(int j=0;j<q.m;j++)
    {q.a[i][j]=0;}
for (i=0;i<q.n;i++)
for (j=0;j<q.m;j++)
q.a[i][j]=k.a[i][j]+a[i][j];
return q;
}
template <class Type>
dmasiv<Type>& dmasiv<Type>::operator =(const dmasiv<Type>& q)
  {
    delete[] a;
    n=q.n;
    m=q.m;
    a=new int*[n];
    for(int i=0 ; i<n ; i++)
    a[i]=new int[m];
    for(int i=0; i<n; i++)
    for (int j=0;j<m;j++) a[i][j]=q.a[i][j];
    return *this;
  }
 
template <class Type>
istream& operator >> (istream& s, dmasiv<Type>& q);
template <class Type>
istream& operator>>(istream& s, dmasiv<Type>& q)
{
q.setData();
return s;
}
template<class Type> ostream& operator<<(ostream& s,  dmasiv<Type>& w);
template <class Type>
ostream& operator<<(ostream& s, dmasiv<Type>& w)
{
w.getData();
return (s);
}
int main()
{
int x, i;
dmasiv<int> q;
cout<<"Input size of matrix."<<endl;
cout<<"For example 2 = 2x2"<<endl;
cin>>x;
dmasiv<int> o(x);
dmasiv<int> k(x);
o.creatData();
cout<<"Input element's of matrix O"<<endl;
cin>>o;
k.creatData();
cout<<"Input element's of matrix K"<<endl;
cin>>k;
cout<<" Menu"<<endl;
cout<<"1. Multiplication"<<endl;
cout<<"2. Sum"<<endl;
cout<<"3. Minus"<<endl;
cin>>i;
switch(i)
{
case 1:q = o * k;cout<<q<<endl;break;
case 2:q = o + k;cout<<q<<endl;break;
case 3:q = o - k;cout<<q<<endl;break;
default: cout<<"Incorect input"<<endl;break;
}
system("pause");
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2011, 00:54     Как переделать friend-перегрузки ввода/вывода в метод класса?
Посмотрите здесь:
C++ Как выставить failbit внутри тела перегрузки операторов ввода/вывода
C++ Функции для ввода/вывода массивов и матриц с помощью шаблонов и перегрузки
C++ Friend-функции перегрузки оператора
C++ Переделать потоки ввода-вывода на prinf и scanf
Переделать, чтобы в программе использовалась функция ввода - вывода:) C++
C++ Как объявить friend функцию класса
C++ Перегрузка операций ввода/вывода в шаблоне класса
Как правильно использовать friend для доступа к экземпляру класса C++
C++ Почему перегруженные операторы ввода/вывода нельзя сделать членами класса?
Для класса Vector перегрузить операторы присваивания, сравнения, ввода и вывода C++
C++ Перегрузка потокового ввода/вывода для класса с полем типа string
Friend функция вывода C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Maxim Prishchepa
Эксперт С++
1920 / 1032 / 74
Регистрация: 29.03.2010
Сообщений: 3,167
07.05.2011, 00:56     Как переделать friend-перегрузки ввода/вывода в метод класса? #2
что имеется ввиду под
Цитата Сообщение от Omenjke Посмотреть сообщение
шаблонить френдовые перегрузки
и
Цитата Сообщение от Omenjke Посмотреть сообщение
как переделать френдовые перегрузки ввода\вывода в метод класса?
это какие-то новые термины? я до такой степени отстал от программирования? :-))

Добавлено через 1 минуту
:-))) это называется шаблонный класс и шаблонные методы
Omenjke
Сообщений: n/a
07.05.2011, 01:04     Как переделать friend-перегрузки ввода/вывода в метод класса? #3
ну я еще в терминах не сильно силен.
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
07.05.2011, 09:38     Как переделать friend-перегрузки ввода/вывода в метод класса? #4
тоже как то раз запарился с этим...
я делал так для класа очередь
в классе обьявил
C++
1
2
template<typename Type> friend ostream &operator<<(ostream &s, const Queue<Type>& obj);
    template<typename Type> friend istream &operator >>(istream &s, Queue<Type>& obj);
реализация
C++
1
2
3
4
template <typename Type> ostream& operator <<(ostream &s, const Queue<Type>& obj)
...........................................
template <typename Type> istream &operator>>(istream &s,  Queue<Type>& obj)
..........................................
Yandex
Объявления
07.05.2011, 09:38     Как переделать friend-перегрузки ввода/вывода в метод класса?
Ответ Создать тему
Опции темы

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