【发布时间】:2026-01-10 19:50:01
【问题描述】:
我正在开发一个学校管理系统命令行界面应用程序。首先,让我尝试解释一下我的程序是如何设计的以及我想要实现的目标。
我目前的程序设计:
我有三个班级,即。 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
【问题讨论】:
-
还要记住 sizeof() 是一个编译时间常数。
-
我猜你还不知道模板函数?
-
@drescherjm 感谢您指导我进行对象切片。我会读到它。 sizeof() 作为编译时常量会导致任何问题吗?是的,你说得对,我不知道模板函数。它能帮我解决这个问题吗?
标签: c++ function oop inheritance file-io