Дано код....описание : Запись множество обиектов в файл когда размеры порождаюших классов разные
Но я ни как не могу найти свзяь между некоторыми строками
Сразу скожу по русски плохо пишу и я новичек в C++
C++ (Qt) |
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
| #include <iostream>
#include <string>
#include <fstream>
#include <typeinfo>
#include <process.h>
using namespace std;
const int LEN = 32;
const int MAXEM = 100;
enum employee_type {tmanager,tscientist,tlaborer};
class employee
{
private:
static int n;
static employee *arrap[];
unsigned long number;
char name[LEN];
public:
virtual void getdata()
{cin >> name; cin >> number;}
virtual void putdata()
{cout << name << number << endl;}
virtual employee_type get_type();
static void add();
static void display();
static void read();
static void write();
};
int employee::n;
employee *employee::arrap[MAXEM];
class manager:public employee{};
class scientist:public employee{};
class laborer:public employee{};
void employee::add()
{
char ch;
cout << "m - add manager\n"
"s - add scientist\n"
"l - add laborer";
cin >> ch;
switch(ch)
{
case 'm': arrap[n] = new manager; break;
case 's': arrap[n] = new scientist; break;
case 'l': arrap[n] = new laborer; break;
default: cout << "Canot exist this type"; return;
}
arrap[n++]->getdata();
}
void employee::display()
{
for(int i=0;i<n;i++)
{
cout << (i+1);
switch(arrap[n]->get_type())
{
case tmanager: cout << "Type Manager:"; break;
case tscientist: cout << "Type Scientist:"; break;
case tlaborer: cout << "Type Laborer:"; break;
default : cout << "Unknow Type";
}
arrap[i]->putdata();
}
}
employee_type employee::get_type()
{
if(typeid(*this) == typeid(manager))
return tmanager;
else if(typeid(*this) == typeid(scientist))
return tscientist;
else if(typeid(*this) == typeid(laborer))
return tlaborer;
else
{cerr << "Unknow type"; exit(1);}
return tmanager;
}
void employee::write()
{
int size;
cout << "Rec..." << n << endl;
ofstream ouf;
employee_type etype;
ouf.open("emp.dat",ios::trunc|ios::binary);
if(!ouf){cerr << "canot open the file"; return;}
for(int i=0;i<n;i++)
{
etype = arrap[i]->get_type();
ouf.write((char*)&etype,sizeof(etype));
switch(etype)
{
case tmanager: size=sizeof(manager); break;
case tscientist: size=sizeof(scientist); break;
case tlaborer: size=sizeof(laborer); break;
}
if(!ouf){cerr << "Canot write in file"; return;}
}
}
void employee::read()
{
int size;
employee_type etype;
ifstream inf;
inf.open("emp.dat",ios::binary);
if(!inf){cerr << "Canot open the file"; return;}
n = 0;
while(true)
{
inf.read((char*)&etype,sizeof(etype));
if(inf.eof()) break;
if(!inf){cerr << "Canot read file"; return;}
switch(etype)
{
case tmanager: arrap[n] = new manager; size=sizeof(manager); break;
case tscientist: arrap[n] = new scientist; size=sizeof(scientist); break;
case tlaborer: arrap[n] = new laborer; size=sizeof(laborer); break;
default:cout << "Unknow Type file"; return;
}
inf.read((char*)arrap[n],size);
if(!inf){cerr << "Canot read the file"; return;}
n++;
}
cout << "Rec..." << n << endl;
}
int main()
{
char ch;
while(true)
{
cout << "a - add employee\n"
"d - display\n"
"w - write in file\n"
"r - read the file";
cin >> ch;
switch(ch)
{
case 'a': employee::add(); break;
case 'd': employee::display(); break;
case 'w': employee::write(); break;
case 'r': employee::read(); break;
default: cout << "Unknow Type";
}
system("pause");
return 0;
} |
|
Собствено я не понемаю вот эти строки
C++ (Qt) |
1
2
| etype = arrap[i]->get_type();
ouf.write((char*)&etype,sizeof(etype)); |
|
здесь в etype скажем будет tmanager но как sizeof(etype) знаеь оазмер класса manager я както не вижу такой запись
tmanager = manager;
банально говоря ведь get_type вернет всего лиши тип employee_type который просто равно 1 или tmanager
Еще непонятно вот это т кусок
C++ (Qt) |
1
2
3
4
5
6
| switch(etype)
{
case tmanager: size=sizeof(manager); break;
case tscientist: size=sizeof(scientist); break;
case tlaborer: size=sizeof(laborer); break;
} |
|
здесь size во первых нигде не используется во вторых она локалиная и уничтожается при выходе из функции
так зачем вообще этот кусок кода
И Практически не понемаю всю функцию employee::read()
там обявлена etype типа employee_type но ему ничего не присвоено а ниже функция read() котороя не знаю откуда берет размер класса и знает который класс передан