设计一个虚基类Staff(员工),包含编号、姓名和年龄保护数据成员以及相关的成员函数;由Staff派生出销售员类Salesman,包含销售额保护数据成员以及相关的成员函数;再由Staff派生出经理类Manager;然后由Salesman和Manager类派生出销售经理类SalesManager。现要求设计一个利用文件处理方式实现对公司人员进行管理,具有增加数据、更新数据、查询数据、删除数据以及重组文件的功能。
时间: 2024-03-01 09:55:27 浏览: 166
设计一个人类person,包括人员编号和姓名等数据成员以及相关的成员函数
好的,我明白了你的问题。以下是我对你的问题的回答:
首先,我们需要设计一个虚基类Staff,包含编号、姓名和年龄保护数据成员以及相关的成员函数。这个类的定义如下:
```cpp
class Staff {
protected:
int id; // 员工编号
string name; // 员工姓名
int age; // 员工年龄
public:
virtual void add() = 0; // 增加数据
virtual void update() = 0; // 更新数据
virtual void query() = 0; // 查询数据
virtual void remove() = 0; // 删除数据
virtual void reorganize() = 0; // 重组文件
};
```
接下来,我们由Staff派生出销售员类Salesman,包含销售额保护数据成员以及相关的成员函数。这个类的定义如下:
```cpp
class Salesman : public Staff {
protected:
double sales; // 销售额
public:
void add(); // 增加数据
void update(); // 更新数据
void query(); // 查询数据
void remove(); // 删除数据
void reorganize(); // 重组文件
};
```
然后,我们再由Staff派生出经理类Manager。这个类的定义如下:
```cpp
class Manager : public Staff {
public:
void add(); // 增加数据
void update(); // 更新数据
void query(); // 查询数据
void remove(); // 删除数据
void reorganize(); // 重组文件
};
```
最后,我们由Salesman和Manager类派生出销售经理类SalesManager。这个类的定义如下:
```cpp
class SalesManager : public Salesman, public Manager {
public:
void add(); // 增加数据
void update(); // 更新数据
void query(); // 查询数据
void remove(); // 删除数据
void reorganize(); // 重组文件
};
```
现在,我们需要利用文件处理方式实现对公司人员进行管理。我们可以使用文件流和操作符重载来实现这个功能。具体实现可以参考以下代码:
```cpp
class Staff {
// ...
public:
friend ostream& operator<<(ostream& os, const Staff& s) {
os << s.id << " " << s.name << " " << s.age << " ";
return os;
}
friend istream& operator>>(istream& is, Staff& s) {
is >> s.id >> s.name >> s.age;
return is;
}
};
void Salesman::add() {
ofstream ofs("salesman.txt", ios::app);
ofs << *this << sales << endl;
ofs.close();
}
void Salesman::update() {
fstream fs("salesman.txt");
Salesman s;
while (fs >> s) {
if (s.id == id) {
fs.seekp(fs.tellg());
fs << *this << sales << endl;
break;
}
}
fs.close();
}
void Salesman::query() {
ifstream ifs("salesman.txt");
Salesman s;
while (ifs >> s) {
if (s.id == id) {
cout << s.id << " " << s.name << " " << s.age << " " << s.sales << endl;
break;
}
}
ifs.close();
}
void Salesman::remove() {
ifstream ifs("salesman.txt");
ofstream ofs("temp.txt");
Salesman s;
while (ifs >> s) {
if (s.id != id) {
ofs << s << endl;
}
}
ifs.close();
ofs.close();
remove("salesman.txt");
rename("temp.txt", "salesman.txt");
}
void Salesman::reorganize() {
ifstream ifs("salesman.txt");
vector<Salesman> vec;
Salesman s;
while (ifs >> s) {
vec.push_back(s);
}
ifs.close();
sort(vec.begin(), vec.end(), [](const Salesman& a, const Salesman& b) {
return a.sales > b.sales;
});
ofstream ofs("salesman.txt");
for (const auto& s : vec) {
ofs << s << s.sales << endl;
}
ofs.close();
}
```
上面的代码中,我们使用了五个成员函数,分别是增加数据、更新数据、查询数据、删除数据以及重组文件。我们还使用了文件流和操作符重载来读写文件和输出员工信息。其中,增加数据和更新数据函数使用了ofstream和fstream流进行写操作,查询数据、删除数据和重组文件函数使用了ifstream和ofstream流进行读写操作。
以上就是对公司人员进行管理的实现方法。我们可以根据这个框架,对Manager和SalesManager类进行相应的实现。同时,我们还需要在main函数中调用这些成员函数,来实现对员工信息的管理。
阅读全文