Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587

Код из "Р.Лафоре. ООП в С++"

07.10.2013, 21:02. Показов 3797. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Р.Лафоре. "ООП в С++ " (4-е издание). 2012. Глава 12, стр.574, листинг 12.17, программа EMPL_IO.
В классах присутствуют виртуальные методы и используются бинарные методы чтения\записи памяти под объектами. Кто что думает по поводу этого кода?
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
// empl_io.cpp
// performs file I/O on employee objects
// handles different sized objects
#include <fstream>            //for file-stream functions
#include <iostream>
#include <typeinfo>           //for typeid()
using namespace std;
#include <process.h>          //for exit()
 
const int LEN = 32;           //maximum length of last names
const int MAXEM = 100;        //maximum number of employees
 
enum employee_type {tmanager, tscientist, tlaborer};
////////////////////////////////////////////////////////////////
class employee                //employee class
   {
   private:
      char name[LEN];         //employee name
      unsigned long number;   //employee number
      static int n;           //current number of employees
      static employee* arrap[];  //array of ptrs to emps
   public:
      virtual void getdata()
         {
         cin.ignore(10, '\n');
         cout << "   Enter last name: "; cin >> name;
         cout << "   Enter number: ";      cin >> number;
         }
      virtual void putdata()
         {
         cout << "\n   Name: " << name;
         cout << "\n   Number: " << number;
         }
      virtual employee_type get_type();  //get type
      static void add();      //add an employee
      static void display();  //display all employees
      static void read();     //read from disk file
      static void write();    //write to disk file
   };
//--------------------------------------------------------------
//static variables
int employee::n;              //current number of employees
employee* employee::arrap[MAXEM];  //array of ptrs to emps
////////////////////////////////////////////////////////////////
//manager class
class manager : public employee
   {
   private:
      char title[LEN];        //"vice-president" etc.
      double dues;            //golf club dues
   public:
      void getdata()
         {
         employee::getdata();
         cout << "   Enter title: ";          cin >> title;
         cout << "   Enter golf club dues: "; cin >> dues;
         }
      void putdata()
         {
         employee::putdata();
         cout << "\n   Title: " << title;
         cout << "\n   Golf club dues: " << dues;
         }
   };
////////////////////////////////////////////////////////////////
//scientist class
class scientist : public employee
   {
   private:
      int pubs;               //number of publications
   public:
      void getdata()
         {
         employee::getdata();
         cout << "   Enter number of pubs: "; cin >> pubs;
         }
      void putdata()
         {
         employee::putdata();
         cout << "\n   Number of publications: " << pubs;
         }
   };
////////////////////////////////////////////////////////////////   
//laborer class
class laborer : public employee
   {
   };
////////////////////////////////////////////////////////////////
//add employee to list in memory
void employee::add()
   {
   char ch;
   cout << "'m' to add a manager"
           "\n's' to add a scientist"
           "\n'l' to add a laborer"
           "\nEnter selection: ";
   cin >> ch;
   switch(ch)
      {                       //create specified employee type
      case 'm': arrap[n] = new manager;   break;
      case 's': arrap[n] = new scientist; break;
      case 'l': arrap[n] = new laborer;   break;
      default: cout << "\nUnknown employee type\n"; return;
      }
   arrap[n++]->getdata();     //get employee data from user
   }
//--------------------------------------------------------------
//display all employees
void employee::display()
   {
   for(int j=0; j<n; j++)
      {
      cout  << (j+1);           //display number
      switch( arrap[j]->get_type() )   //display type
         {
         case tmanager:    cout << ". Type: Manager";   break;
         case tscientist:  cout << ". Type: Scientist"; break;
         case tlaborer:    cout << ". Type: Laborer";   break;
         default: cout << ". Unknown type";
         }
      arrap[j]->putdata();    //display employee data
      cout << endl;
      }
   }
//--------------------------------------------------------------
//return the type of this object
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 << "\nBad employee type"; exit(1); }
   return tmanager;
   }
//--------------------------------------------------------------
//write all current memory objects to file
void employee::write()
   {
   int size;
   cout << "Writing " << n << " employees.\n";
   ofstream ouf;              //open ofstream in binary
   employee_type etype;       //type of each employee object
 
   ouf.open("EMPLOY.DAT", ios::trunc | ios::binary);
   if(!ouf)
      { cout << "\nCan't open file\n"; return; }
   for(int j=0; j<n; j++)     //for every employee object
      {                       //get its type
      etype = arrap[j]->get_type();
                              //write type to file
      ouf.write( (char*)&etype, sizeof(etype) );
      switch(etype)           //find its size
         {
         case tmanager:   size=sizeof(manager); break;
         case tscientist: size=sizeof(scientist); break;
         case tlaborer:   size=sizeof(laborer); break;
         }                    //write employee object to file
      ouf.write( (char*)(arrap[j]), size );
      if(!ouf)
         { cout << "\nCan't write to file\n"; return; }
      }
   }
//--------------------------------------------------------------
//read data for all employees from file into memory
void employee::read()
   {
   int size;                  //size of employee object
   employee_type etype;       //type of employee
   ifstream inf;              //open ifstream in binary
   inf.open("EMPLOY.DAT", ios::binary);
   if(!inf)
      { cout << "\nCan't open file\n"; return; }
   n = 0;                     //no employees in memory yet
   while(true)
      {                       //read type of next employee
      inf.read( (char*)&etype, sizeof(etype) );
      if( inf.eof() )         //quit loop on eof
         break;
      if(!inf)                //error reading type
         { cout << "\nCan't read type from file\n"; return; }
      switch(etype)
         {                    //make new employee
         case tmanager:       //of correct type
            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 << "\nUnknown type in file\n"; return;
         }                    //read data from file into it
      inf.read( (char*)arrap[n], size  );
      if(!inf)                //error but not eof
         { cout << "\nCan't read data from file\n"; return; }
      n++;                    //count employee
      }  //end while
   cout << "Reading " << n << " employees\n";
   }
////////////////////////////////////////////////////////////////
int main()
   {
   char ch;
   while(true)
      {
      cout << "'a' -- add data for an employee"
              "\n'd' -- display data for all employees"
              "\n'w' -- write all employee data to file"
              "\n'r' -- read all employee data from file"
              "\n'x' -- exit"
              "\nEnter selection: ";
      cin >> ch;
      switch(ch)
         {
         case 'a':            //add an employee to list
            employee::add(); break;
         case 'd':            //display all employees
            employee::display(); break;
         case 'w':            //write employees to file
            employee::write(); break;
         case 'r':            //read all employees from file
            employee::read(); break;
         case 'x': exit(0);   //exit program
         default: cout << "\nUnknown command";
         }  //end switch
      }  //end while
   return 0;
   }  //end main()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2013, 21:02
Ответы с готовыми решениями:

Пособие Р.Лафоре. ООП в С++
Отличная книга(для начала), но вот задания в ней ужасно запутаны. Может кто-нибудь объяснить,есть ли смысл разбираться в различных...

Решения упражнений [Книга Р.Лафоре "ООП в С++]
//Глава 4. Структуры. Перечисления. //Упражнение 6 #include&lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; int main() {...

Дальнейшее чтение после Р.Лафоре искусство ООП программирования С++
Всем привет. Прочел книгу Р.Лафоре искусство ООП программирования С++. И вот стою курю и думаю. А что собственно, дальше. Я вроде как...

12
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,033
Записей в блоге: 1
07.10.2013, 21:09
Цитата Сообщение от alsav22 Посмотреть сообщение
В классах присутствуют виртуальные методы
А что в этом такого?
Правда я не вижу виртуального деструктора

Добавлено через 2 минуты
Или Вы имеете ввиду, что будет и указатель на таблицу виртуальных функций записан при
Цитата Сообщение от alsav22 Посмотреть сообщение
используются бинарные методы чтения\записи памяти под объектами.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.10.2013, 21:11  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Или Вы имеете ввиду, что будет и указатель на таблицу виртуальных функций записан
Именно это.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,033
Записей в блоге: 1
07.10.2013, 21:33
Цитата Сообщение от alsav22 Посмотреть сообщение
Именно это.
скажем так, что в пределах одной компиляции это не так критично. Но если, создать файл, выйти, потом перекомпилировать программу, и потом считать, то адрес таблицы может поменяться и тогда беда.

Добавлено через 4 минуты
Специально потестил:
Первый запуск:
croessmah@croessmah-pc:~/c++/prj1/prj1$ ./main
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: a
'm' to add a manager
's' to add a scientist
'l' to add a laborer
Enter selection: m
Enter last name: 1111
Enter number: 22
Enter title: 333
Enter golf club dues: 4444

'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Вот этот момент важен (то, что создали):
Enter selection: d
1. Type: Manager
Name: 1111
Number: 22
Title: 333
Golf club dues: 4444
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: w
Writing 1 employees.
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: r
Reading 1 employees
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Вот этот момент важен (то, что записали в файл и считали):
Enter selection: d
1. Type: Manager
Name: 1111
Number: 22
Title: 333
Golf club dues: 4444
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: x
Вышли из программы, добавил в прогу одну функцию:
C++
1
2
3
4
 int foo () {
     std::cout <<"Fuck off"<<std :: endl;
     return 25 ;
 }
и её вызов в main

Теперь запускаем новую программу:
croessmah@croessmah-pc:~/c++/prj1/prj1$ ./main
Fuck off //Добавленная строчка
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: r
Считали данные (там как и положенно один рабочий)
Reading 1 employees
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
И кульминация:
Enter selection: d
1. Type: Scientist
Name: 1111
Number: 22
Number of publications: 3355443

'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: x
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.10.2013, 21:56  [ТС]
Я его так пробовал: код в Debug записывал, а четние и вывод - в Release (или наоборот), или переносил файл, записанный в студии, в Code Blocks и запускал там чтение файла и вывод данных. Ошибки.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,033
Записей в блоге: 1
07.10.2013, 22:24
Цитата Сообщение от alsav22 Посмотреть сообщение
Кто что думает по поводу этого кода?
вот:
Цитата Сообщение от alsav22 Посмотреть сообщение
Ошибки.
В книге далее нигде не упоминается об этом?

Добавлено через 10 минут
Да и еще, нафига
C++
1
#include <process.h>          //for exit()
cstdlib же есть!
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.10.2013, 22:33  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
В книге далее нигде не упоминается об этом?
Сильно далеко не смотрел. Далее есть описание взаимодействия с этого программой (скрины). Всю книгу не читал, поэтому сказать не могу: затрагивается ли там эта тема или нет, но мне кажется, что о таких вещах сразу предупреждают.
Миниатюры
Код из "Р.Лафоре. ООП в С++"   Код из "Р.Лафоре. ООП в С++"  
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,033
Записей в блоге: 1
07.10.2013, 22:36
Цитата Сообщение от alsav22 Посмотреть сообщение
что о таких вещах сразу предупреждают.
В книжных листингах всегда есть ошибки, которые могут оставаться не замеченными долгое время. Если есть более новое издание, может в нем они уже исправлены.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.10.2013, 22:46  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
В книжных листингах всегда есть ошибки
Есть то они есть... Но тут ошибка не техническая (если это ошибка). Тут же весь код на полиморфизме построен.

Добавлено через 4 минуты
Да и более поздних изданий я не вижу.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,033
Записей в блоге: 1
07.10.2013, 22:50
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут же весь код на полиморфизме построен.
Цитата Сообщение от alsav22 Посмотреть сообщение
Но тут ошибка не техническая
Почему не техническая? Как раз самая техническая - забыли про реализацию виртуальности.

Не по теме:

Как раз моя подпись подходит... про второй экземпляр :D

0
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
08.12.2013, 16:35
up
Как раз изучаю тему работы с файлами по этой книге. Тоже столкнулся с этой проблемой. В пределах одной компиляции все работает стабильно - пишет-читает-выводит. Но после перезапуска ,при попытки считать - пишет что считал,а при попытки вывести на экран - компилятор завершает работу. Я с плюсами недавно, по-этому,не могли бы вы популярно объяснить почему так происходит ?
Буду благодарен
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.12.2013, 16:52  [ТС]
Здесь почитайте: Запись и чтение объектов разных классов в один файл
Запись и извлечение данных в несколько запусков программы
1
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
08.12.2013, 17:35
Благодарю,разобрался
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2013, 17:35
Помогаю со студенческими работами здесь

Зацикливание программы. В чем же ошибка? ( Упражнение 5 Глава 7 Лафоре ООП C++)
Миллион раз пересмотрел, ну не вижу ошибку и все тут :(. Должна же остановка на вводе быть! Что туда передается.... Не понятно... Помогите...

Работа с Классами или разбираем 10 Упражнение 6 главы книги ООП в С++ Р.Лафоре
Доброго времени суток господа. Подскажите пожалуйста каким образом можно объединить классы? Почему при создание объекта ship в main выдает...

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

Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")
Лафоре &quot;ООП в Си ++ &quot; - проблемы с упражнением 12, глава 7 Условие: Напишите программу, которая будет принимать от пользователя две...

Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой
Изучаю C++ по книге Р. Лафоре. Дошёл до 5-ой главы, и мне встретился пример использования консольной графики. Страница 179. Пример...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru