Запись производных членов класса в двоичный файл

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

Мой нынешний дизайн программы:
У меня есть три класса, а именно. 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, как это может быть достигнуто?

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

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

0

Решение

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

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

Увидеть: http://www.cplusplus.com/doc/oldtutorial/templates/

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]