我正在研究学校管理系统命令行界面应用程序。首先,让我尝试解释程序的设计方式以及我要实现的目标。
我目前的程序设计:
我有三堂课。 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
,并且文件路径也不同。
我要实现的目标:
由于三个功能的功能相同。我想用一个功能代替它。因此,我在互联网上搜索并阅读了一些继承和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);
}
仅id
和name
从student.dat
文件中删除。类Student
的所有数据成员均未删除。我想删除Student
的所有数据成员。如何实现?
我希望我能详细解释这个问题。我将寻找解决方案:)
完整的源代码可以在以下网址找到:https://github.com/vkWeb/school-management-system/blob/master/main.cpp
答案 0 :(得分:0)
对于此特定问题,模板函数非常适合:
template <class T>
void removeMember(string filePath, string tempFilePath) {
T MemberObject;
// Rest of your code
}