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

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

Войти
Регистрация
Восстановить пароль
 
alex1392
31 / 31 / 3
Регистрация: 24.07.2013
Сообщений: 187
#1

глюк при написании перегруженного ostream для класса - C++

08.08.2013, 22:30. Просмотров 415. Ответов 2
Метки нет (Все метки)

Доброе время суток всем! Возникла проблема есть некий класс client смотреть ниже класс авто и класс персона
Все отлично работало до того момента пока я не попытался написать перегруженный оператор ostream<< для класса клиент в котором есть экземпляры классов авто клиент и дата который так же присутствует у персоны как дата рождения. Все работало отлично пока не попытался выводить и использовать ostream для клиента Подскажите пожалуйста из за чего это происходит и в чем я ошибся критика по поводу кода так же принимается )
Ниже приведена вся прога а в самом низу копия ошибки
avto.h
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
#include <iostream>
#include <fstream>
using namespace std;
#pragma once
class avto
{
    string body_type;               //тип кузова
    string mark;                    //марка автомобиля
    string model;                   //модель автомобиля
    string transmission;            //коробка передач
    string type_of_fuel;            //вид топлива
    double displacement;            //обьем двигателя
    int year_of_manufacture;        //год выпуска
public:
    avto();
    avto(string abody_type,string amark,string amodel,string atransmission,string atype_of_fuel,double adisplacement,int ayear_of_manufacture);
    avto(const avto&a);
    avto operator=(const avto&a);
    friend ofstream& operator<<(ofstream&os,const avto&a);
    friend ifstream& operator>>(ifstream&is,avto&a);
    friend ostream& operator<<(ostream& os,const avto& a);
    friend istream& operator>>(istream& is, avto& a);
 
};
date.h
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
#pragma once
#include <iostream>
#include <fstream>
using namespace std;
class date
{
 
    int day;
    int mounth;
    int year;
public:
    date();
    date(int d,int m,int y);
    date(const date&a);
    
    void set_day(int d);
    void set_mounth(int m);
    void set_year(int y);
 
    int get_day()const;
    int get_mounth()const;
    int get_year()const;
 
    date operator=(const date&a);
    friend ostream& operator<<(ostream& os,const date& a);
    friend istream& operator>>(istream& is, date& a);
    friend ofstream& operator<<(ofstream &os,const date &a);
    friend ifstream& operator>>(ifstream &is,date &a);
};
Person.h
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
#pragma once
#include <iostream>
#include <string>
#include "date.h"
#include <fstream>
using namespace std;
class Person
{
    string name;
    string family;
    string patronymic;
    string address;
    string phone;
    string email;
    string ICQ;
    date birthday;
public:
    Person();
    Person(string aname,    string afamily,string apatronymic,  string aaddress,    string aphone,  string aemail,  string aICQ ,int d,int m,int y);
    Person(const Person&a);
    Person operator=(const Person&a);
    
    friend ofstream& operator<<(ofstream&os,const Person&a);
    friend ifstream& operator>>(ifstream&is,Person&a);
    friend ostream& operator<<(ostream& os,const Person& a);
    friend istream& operator>>(istream& is, Person& a);
};
client.h
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
#include <iostream>
#include <fstream>
#include "avto.h"
#include "date.h"
#include "Person.h"
using namespace std;
#pragma once
class client
{
    Person personal_data;
    avto specifications;
    date order;
public:
    client(){};
    client(const Person&p,const avto&a,int o_d,int o_m,int o_y)
    {
        personal_data=p;
        specifications=a;
        order.set_day(o_d);
        order.set_mounth(o_m);
        order.set_year(o_y);
    }
    friend ostream operator<<(ostream& os,const client&a);      //при попытки написания глючит
    void show()
    {
        cout<<personal_data;
        cout<<specifications;
        cout<<"Order date="<<order;
    }
};
avto.cpp
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
#include <iostream>
#include "avto.h"
avto::avto()
{
 
}
avto::avto(string abody_type,string amark,string amodel,string atransmission,string atype_of_fuel,double adisplacement,int ayear_of_manufacture)
{
    body_type=abody_type;
    mark=amark;
    model=amodel;
    transmission=atransmission;
    type_of_fuel=atype_of_fuel;
    displacement=adisplacement;
    year_of_manufacture=ayear_of_manufacture;
}
avto::avto(const avto&a)
{
    body_type=a.body_type;
    mark=a.mark;
    model=a.model;
    transmission=a.transmission;
    type_of_fuel=a.type_of_fuel;
    displacement=a.displacement;
    year_of_manufacture=a.year_of_manufacture;
}
avto avto::operator=(const avto&a)
{
    body_type=a.body_type;
    mark=a.mark;
    model=a.model;
    transmission=a.transmission;
    type_of_fuel=a.type_of_fuel;
    displacement=a.displacement;
    year_of_manufacture=a.year_of_manufacture;
    return *this;
}
date.cpp
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
#include <iostream>
#include "date.h"
using namespace std;
    date::date()
    {
 
    }
    date::date(int d,int m,int y)
    {
        day=d;
        mounth=m;
        year=y;
    }
    date::date(const date&a)
    {
        day=a.get_day();
        mounth=a.get_mounth();
        year=a.get_year();
    }
    
    void date::set_day(int d)
    {
        day=d;
    }
    void date::set_mounth(int m)
    {
        mounth=m;
    }
    void date::set_year(int y)
    {
        year=y;
    }
 
    int date::get_day()const
    {
        return day;
    }
    int date::get_mounth()const
    {
        return mounth;
    }
    int date::get_year()const
    {
        return year;
    }
    date date::operator=(const date&a)
    {
        day=a.day;
        mounth=a.mounth;
        year=a.year;
        return *this;
    }
Person.cpp
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
#include <iostream>
#include "date.h"
#include "Person.h"
using namespace std;
Person::Person(){};
Person::Person(string aname,    string afamily,string apatronymic,  string aaddress,    string aphone,  string aemail,  string aICQ ,int d,int m,int y)
{
    name=aname;
    family=afamily;
    patronymic=apatronymic;
    address=aaddress;
    phone=aphone;
    email=aemail;
    ICQ=aICQ;
    birthday.set_day(d);
    birthday.set_mounth(m);
    birthday.set_year(y);
}
Person::Person(const Person&a)
{
    name=a.name;
    family=a.family;
    patronymic=a.patronymic;
    address=a.address;
    phone=a.phone;
    email=a.email;
    ICQ=a.ICQ;
    birthday=a.birthday;
}
Person Person::operator=(const Person&a)
{
    name=a.name;
    family=a.family;
    patronymic=a.patronymic;
    address=a.address;
    phone=a.phone;
    email=a.email;
    ICQ=a.ICQ;
    birthday=a.birthday;
    return *this;
}
main.cpp
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
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include "avto.h"
#include "date.h"
#include "Person.h"
#include "client.h"
#include <vector>
using namespace std;
ostream& operator<<(ostream& os,const date& a)
{
    os<<a.day<<",";
    os<<a.mounth<<",";
    os<<a.year<<endl;
    return os;
}
istream& operator>>(istream&is,date&a)
{
 
    cout<<"enter day=";
    is>>a.day;
 
    cout<<"enter mounth=";
    is>>a.mounth;
 
    cout<<"enter year=";
    is>>a.year;
    return is;
}
ifstream& operator>>(ifstream &is,date &a)
{
    int sz=sizeof(int);
    is.read((char*)&a.day,sz);
    is.read((char*)&a.mounth,sz);
    is.read((char*)&a.year,sz);
    return is;
}
ofstream& operator<<(ofstream &os,const date &a)
{
    int sz=sizeof(int);
    os.write((char*)&a.day,sz);
    os.write((char*)&a.mounth,sz);
    os.write((char*)&a.year,sz);
    return os;
}
 
ostream& operator<<(ostream& os,const Person& a)
{
    os<<"name="<<a.name<<endl;
    os<<"family="<<a.family<<endl;
    os<<"patronymic="<<a.patronymic<<endl;
    os<<"address="<<a.address<<endl;
    os<<"phone="<<a.phone<<endl;
    os<<"email="<<a.email<<endl;
    os<<"ICQ="<<a.ICQ<<endl;
    os<<"birthday=";
    os<<a.birthday<<endl;
    return os;
}
istream& operator>>(istream& is, Person& a)
{
    cout<<"enter name=";
 
    getline(is,a.name);
    //is>>a.name;
    cout<<"enter family=";
    getline(is,a.family);
    //is>>a.family;
    cout<<"enter patronymic=";
    getline(is,a.patronymic);
    //is>>a.patronymic;
    cout<<"enter address=";
    getline(is,a.address);
    //is>>a.address;
    cout<<"enter phone=";
    getline(is,a.phone);
    //is>>a.phone;
    cout<<"enter email=";
    getline(is,a.email);
    //is>>a.email;
    cout<<"enter ICQ=";
    getline(is,a.ICQ);
    //is>>a.ICQ;
 
    cout<<"enter birthday";
    is>>a.birthday;
    cin.ignore();
    return is;
}
ofstream& operator<<(ofstream& os,const Person& a)
{
 
    //os.write((char*)&a.birthday, sizeof(date));
 
    int len = a.name.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.name.c_str(), len);
 
    len = a.family.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.family.c_str(), len);   
 
    len = a.patronymic.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.patronymic.c_str(), len); 
 
    len = a.address.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.address.c_str(), len);
 
    len = a.phone.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.phone.c_str(), len); 
 
    len = a.email.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.email.c_str(), len);
 
    len = a.ICQ.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.ICQ.c_str(), len);
 
    os<<a.birthday;
 
    return os;
}
ifstream& operator>>(ifstream& is, Person& a)
{
 
    //is.read((char*)&a.birthday, sizeof(date));
    int len;
 
    is.read((char*)&len, sizeof(int));
    if (is.eof()) return is;
    char *buf = new char[len];
    is.read(buf, len);
    a.name = buf;
    delete[] buf;
 
    is.read((char*)&len, sizeof(int));
    buf = new char[len];
    is.read(buf, len); 
    a.family = buf;
    delete[] buf;
 
    is.read((char*)&len, sizeof(int));
    buf = new char[len];
    is.read(buf, len); 
    a.patronymic = buf;
    delete[] buf;
 
    is.read((char*)&len, sizeof(int));
    buf = new char[len];
    is.read(buf, len); 
    a.address = buf;
    delete[] buf;
 
    is.read((char*)&len, sizeof(int));
    buf = new char[len];
    is.read(buf, len); 
    a.phone = buf;
    delete[] buf;
 
    is.read((char*)&len, sizeof(int));
    buf = new char[len];
    is.read(buf, len); 
    a.email = buf;
    delete[] buf;
 
    is.read((char*)&len, sizeof(int));
    buf = new char[len];
    is.read(buf, len); 
    a.ICQ = buf;
    delete[] buf;
 
    is>>a.birthday;
    return is;
}
 
ostream& operator<<(ostream& os,const avto& a)
{
    os<<"body type="<<a.body_type<<endl;
    os<<"mark="<<a.mark<<endl;
    os<<"model="<<a.model<<endl;
    os<<"transmission="<<a.transmission<<endl;
    os<<"type_of_fuel="<<a.type_of_fuel<<endl;
    os<<"displacement="<<a.displacement<<endl;
    os<<"year_of_manufacture="<<a.year_of_manufacture<<endl;
    
    return os;
}
istream& operator>>(istream& is, avto& a)
{
    cout<<"enter body_type=";
    getline(is,a.body_type);
 
    cout<<"enter mark=";
    getline(is,a.mark);
 
    cout<<"enter model=";
    getline(is,a.model);
 
    cout<<"enter transmission=";
    getline(is,a.transmission);
 
    cout<<"enter type_of_fuel=";
    getline(is,a.type_of_fuel);
 
    cout<<"enter displacement=";
    cin>>a.displacement;
 
    cout<<"enter year_of_manufacture=";
    cin>>a.year_of_manufacture;
 
    cin.ignore();
    return is;
}
ofstream& operator<<(ofstream&os,const avto&a)
{
    int len = a.body_type.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.body_type.c_str(), len);
 
    len = a.mark.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.mark.c_str(), len);  
 
    len = a.model.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.model.c_str(), len);  
 
    len = a.transmission.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.transmission.c_str(), len);  
 
    len = a.type_of_fuel.length() + 1;
    os.write((char*)&len, sizeof(int));
    os.write(a.type_of_fuel.c_str(), len);  
 
    len = sizeof(int);
    double d=sizeof(double);
    //os.write((char*)&a.displacement, d);
    os.write((char*)&a.year_of_manufacture, len);  
 
    return os;
}
ifstream& operator>>(ifstream&is,avto&a)
{
    int len;
 
    is.read((char*)&len, sizeof(int));
    if (is.eof()) return is;
    char *buf = new char[len];
    is.read(buf, len);
    a.body_type = buf;
    delete[] buf;
 
    is.read((char*)&len, sizeof(int));
    buf = new char[len];
    is.read(buf, len); 
    a.mark = buf;
    delete[] buf;
 
    is.read((char*)&len, sizeof(int));
    buf = new char[len];
    is.read(buf, len); 
    a.model = buf;
    delete[] buf;
 
    is.read((char*)&len, sizeof(int));
    buf = new char[len];
    is.read(buf, len); 
    a.transmission = buf;
    delete[] buf;
 
    is.read((char*)&len, sizeof(int));
    buf = new char[len];
    is.read(buf, len); 
    a.type_of_fuel = buf;
    delete[] buf;
 
    is.read((char*)&a.displacement, sizeof(double));
    is.read((char*)&a.year_of_manufacture, sizeof(int));
 
    return is;
}
ostream operator<<(ostream& os,const client&d)
{
    os<<d.personal_data;
    os<<d.specifications;
    os<<"order date=";
    os<<d.order;
    return os;
}
 
void main()
{
    
    avto audi("kabriolet","audi","derro","avtomat","benzin",3.2,2014);
    avto ford("korob","ford","sergo","avtomat","dizel'",2.8,2012);
     
    Person alex("Alex","lolkin","Anatolievich","siv 11","584845","5589@mail.ru","886699",6,10,2012);
    Person dima("dima","falonov","vitalievich","konina 22","0632548789","dim1975@mail.ru","548",12,11,1975);
    
    client z1(alex,audi,8,8,2013);
    client z2(dima,ford,8,8,2013);
cout<<z1;
cout<<z2;
 
}
Ошибка
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
1>------ Build started: Project: string, Configuration: Debug Win32 ------
1>Build started 08.08.2013 21:27:06.
1>ClCompile:
1>  main.cpp
1>c:\program files\microsoft visual studio 10.0\vc\include\ostream(604): error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files\microsoft visual studio 10.0\vc\include\ios(176) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_ostream<_Elem,_Traits>::basic_ostream(const std::basic_ostream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.62
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Если убрать из мейна cout<<для класса клиент и убрать саму реализацию ostream для класса клиент все работает как часы
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2013, 22:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос глюк при написании перегруженного ostream для класса (C++):

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса - C++
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...

Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream - C++
Добрый день. В учебнике попалось на первый взгляд простое задание: #include &lt;iostream&gt; int main() { std::cout &lt;&lt; &quot;Hello,...

Ошибка при написании класса: Unhandled exception std::bad_alloc at memory location - C++
ПИшу свой клас Var, проблема в следующем из-за строчки first = first+1; вылетает ошибка Unhandled exception at at 0x760FB727 in...

Ошибка при написании класса: error LNK2019: ссылка на неразрешенный внешний символ - C++
Код: int _tmain(int argc, _TCHAR* argv) { Fraction x, x2, y, y2, fl, res, c; cout &lt;&lt; &quot;...&quot; &lt;&lt; endl; x.setFraction(); ...

Шаблон класса и перегруженного оператора отказываются дружить - C++
Всем привет! Помогите разобраться с шаблонами, не получается подружить шаблон класса и шаблон перегруженного оператора. Выдает ошибку. ...

Шаблоны классов, перегрузка operator<< класса ostream - C++
Не компилируется программа. fatal error: 1 unresolved externals Как правильно определить operator&lt;&lt; ??? #include &lt;iostream&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gray_fox
What a waste!
1507 / 1210 / 68
Регистрация: 21.04.2012
Сообщений: 2,545
Завершенные тесты: 3
08.08.2013, 22:39 #2
Цитата Сообщение от alex1392 Посмотреть сообщение
C++
1
ostream operator<<(ostream& os,const client&d)
ostream & operator<<
alex1392
31 / 31 / 3
Регистрация: 24.07.2013
Сообщений: 187
08.08.2013, 22:41  [ТС] #3
Цитата Сообщение от gray_fox Посмотреть сообщение
ostream & operator<<
Благодарю )) это наверное все из за вечернего времени и полубессознательного состояния )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2013, 22:41
Привет! Вот еще темы с ответами:

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? - C++
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

friend ostream &operator<<(ostream &stream, MyClass o); - C++
Что означает данная строчка которую обычно пишут в конце класса? friend ostream &amp;operator&lt;&lt;(ostream &amp;stream, MyClass o);

вызвать неперегруженный оператор при наличии перегруженного - C++
привет всем. возникла такая проблема: есть два объекта одного класса и перегруженный оператор=. одним из полей этих объектов является...

Ошибка при вызове в switch перегруженного оператора - C++
есть перегруженный оператор: std::istream&amp; operator&gt;&gt;(istream&amp; is, diagram&amp; dd) { string kod; std::cout&lt;&lt;&quot;Vvedite kod:&quot;&lt;&lt;endl; ...


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

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

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