Запись производных членов класса в двоичный файл - PullRequest
0 голосов
/ 04 января 2019

Я работаю над приложением интерфейса командной строки системы школьного управления. Сначала позвольте мне объяснить, как устроена моя программа и чего я пытаюсь достичь.

Мой нынешний дизайн программы:
У меня есть три класса, а именно. Student, Teacher и Staff. Все три класса наследуются от класса SchoolMember публично. SchoolMember имеет данные членов int id и char name[30]. Student, Teacher и Staff имеют некоторые дополнительные элементы данных и функции-члены.

У меня есть три разные функции removeStudent(), removeTeacher() и removeStaff() для удаления содержимого ученика, учителя и персонала соответственно из двоичного файла.
Вот как выглядит removeTeacher():

void removeTeacher()
{
  Teacher teacherRead;
  int inputTeacherId; 
  short flag = 0;
  ifstream fileToRead("data/teacher.dat", ios::binary);
  ofstream fileToWrite("data/temp_teacher.dat", ios::binary | ios::app);
  cout << "Enter ID of teacher whose data has to be removed: ";
  cin >> inputTeacherId;
  while (fileToRead.read((char *)&teacherRead, sizeof(teacherRead)))
  {
    if (inputTeacherId == teacherRead.getId())
      flag++;
    else
      fileToWrite.write((char *)&teacherRead, sizeof(teacherRead));
  }
  if (flag == 0)
    cout << "Sorry, No Match found.";
  else
    cout << "Data of teacher " << inputTeacherId << " has been removed from file.";
  fileToRead.close();
  fileToWrite.close();
  remove("data/teacher.dat");
  rename("data/temp_teacher.dat", "data/teacher.dat");
}

Функции removeStudent() и removeStaff() абсолютно одинаковы! Единственное отличие состоит в том, что объект используется в removeStudent() Student studentRead и в removeTeacher() Teacher teacherRead, а также в пути к файлу.

Чего я пытаюсь достичь:
Поскольку функциональность трех функций одинакова. Я хочу заменить его одной функцией. Итак, я искал в Интернете и прочитал некоторые концепции наследования и ООП. Затем я реализовал функцию:

void removeMember(string filePath, string tempFilePath, SchoolMember member)
{
  int inputId = 0; 
  short flag = 0;
  ifstream fileToRead(filePath.c_str(), ios::binary);
  ofstream fileToWrite(tempFilePath.c_str(), ios::binary | ios::app);
  cout << "Enter ID whose data has to be removed: "; 
  cin >> inputId;
  while (fileToRead.read((char *)&member, sizeof(member)))
  {
    if (inputId == member.getId())
      ++flag;
    else
      fileToWrite.write((char *)&member, sizeof(member));
  }
  if (flag == 0)
    cout << "Sorry, No Match found.";
  else
    cout << "Data of ID " << inputId << " has been removed from file.";
  fileToRead.close();
  fileToWrite.close();
  remove(filePath.c_str());
  rename(tempFilePath.c_str(), filePath.c_str());
}

Теперь, когда я вызываю вышеуказанную функцию в:

void removeDataScreen()
{
  Student schoolStudent; // Object
  removeMember("data/student.dat", "data/temp_student.dat", schoolStudent);
}

Только id и name удаляются из файла student.dat. Все члены класса Student не удалены. Я хочу удалить все данные членов Student. как это может быть достигнуто?

Надеюсь, я объяснил проблему достаточно подробно. Я буду искать решения :) 1050 *

Полный исходный код можно найти по адресу: https://github.com/vkWeb/school-management-system/blob/master/main.cpp

1 Ответ

0 голосов
/ 05 января 2019

Для этой конкретной задачи хорошо подходят шаблонные функции:

template <class T>
void removeMember(string filePath, string tempFilePath) {
    T MemberObject;
    // Rest of your code
}

См .: http://www.cplusplus.com/doc/oldtutorial/templates/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...