将派生的班级成员写入二进制文件

时间:2019-01-04 14:15:27

标签: c++ function oop inheritance file-io

我正在研究学校管理系统命令行界面应用程序。首先,让我尝试解释程序的设计方式以及我要实现的目标。

我目前的程序设计:
我有三堂课。 StudentTeacherStaff。这三个类都是从类SchoolMember公开继承的。 SchoolMember具有数据成员int idchar name[30]StudentTeacherStaff还有一些其他数据成员和成员函数。

我具有三个不同的功能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,并且文件路径也不同。

我要实现的目标:
由于三个功能的功能相同。我想用一个功能代替它。因此,我在互联网上搜索并阅读了一些继承和OOP概念。然后我实现了一个功能:

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);
}

idnamestudent.dat文件中删除。类Student的所有数据成员均未删除。我想删除Student的所有数据成员。如何实现?

我希望我能详细解释这个问题。我将寻找解决方案:)

完整的源代码可以在以下网址找到:https://github.com/vkWeb/school-management-system/blob/master/main.cpp

1 个答案:

答案 0 :(得分:0)

对于此特定问题,模板函数非常适合:

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

请参阅:http://www.cplusplus.com/doc/oldtutorial/templates/