针对一个简化版的人力资源管理系统, 请用面向对象程序设计思想,按规定要求,实现其菜单子系统部分. 菜单子系统的设计思想: 1. 从菜单类(Menu)派生各种不同的菜单类, 不同的菜单类负责显示自己,处理用户的选择等; 2. 以单例的形式实现一个菜单管理类(MenuMgr), 管理类维护全部的菜单,以及记录当前活动菜单. 3. 程序的主过程是一个循环: 从菜单管理类取得当前活动菜单,执行菜单的相应功能(显示, 获取用户选择,根据选择切换MenuMgr中的活动菜单等). 菜单子系统的预期功能如下: 程序的初始界面: 若选择3,则结束程序 若选择1,则进入组织管理菜单, 若选择4,则变更当前活动菜单为主菜单, 即返回主菜单. 若选择1, 则显示一个部门列表,然后,重新显示组织管理菜单. 部分代码可参考: main函数: App.h文件 App.cpp文件:
时间: 2024-02-09 16:09:51 浏览: 39
Menu类的设计如下:
```cpp
class Menu {
public:
virtual void show() = 0; // 显示菜单
virtual int getChoice() = 0; // 获取用户选择
virtual bool isEnd() = 0; // 是否结束程序
virtual ~Menu() {} // 虚析构函数
};
```
其中,`show()` 方法用于显示菜单,`getChoice()` 方法用于获取用户选择,`isEnd()` 方法用于判断是否结束程序。
然后,我们可以派生出具体的菜单类,例如 `MainMenu`、`OrgMenu` 等。这些菜单类需要实现上述三个方法。
```cpp
class MainMenu : public Menu {
public:
void show() override;
int getChoice() override;
bool isEnd() override;
};
class OrgMenu : public Menu {
public:
void show() override;
int getChoice() override;
bool isEnd() override;
};
```
接下来,我们需要实现一个单例的菜单管理类 `MenuMgr`。
```cpp
class MenuMgr {
public:
static MenuMgr& getInstance(); // 获取单例
void setCurrentMenu(Menu* menu); // 设置当前活动菜单
Menu* getCurrentMenu(); // 获取当前活动菜单
private:
MenuMgr() {} // 构造函数私有化,禁止外部创建对象
MenuMgr(const MenuMgr&) = delete; // 禁止拷贝构造函数
MenuMgr& operator=(const MenuMgr&) = delete; // 禁止赋值运算符
Menu* currentMenu; // 当前活动菜单
};
```
`MenuMgr` 类中包含一个指向当前活动菜单的指针,同时也禁止外部创建对象、拷贝构造函数和赋值运算符,保证单例的实现。
最后,我们可以在主函数中循环执行菜单的相应功能。
```cpp
int main() {
MenuMgr& menuMgr = MenuMgr::getInstance(); // 获取菜单管理类单例
menuMgr.setCurrentMenu(&mainMenu); // 设置当前活动菜单为主菜单
while (!menuMgr.getCurrentMenu()->isEnd()) { // 循环执行菜单功能
menuMgr.getCurrentMenu()->show(); // 显示当前活动菜单
int choice = menuMgr.getCurrentMenu()->getChoice(); // 获取用户选择
if (choice == -1) { // 用户输入错误
std::cout << "Invalid input, please try again." << std::endl;
continue;
}
switch (choice) {
case 1: { // 进入组织管理菜单
menuMgr.setCurrentMenu(&orgMenu);
break;
}
case 4: { // 返回主菜单
menuMgr.setCurrentMenu(&mainMenu);
break;
}
case 3: { // 结束程序
std::cout << "Exiting program..." << std::endl;
return 0;
}
default: { // 其他情况
std::cout << "Invalid input, please try again." << std::endl;
break;
}
}
}
return 0;
}
```
其中,`mainMenu` 和 `orgMenu` 是具体的菜单对象,可以在程序中初始化。在循环中,我们先显示当前活动菜单,然后获取用户选择。根据用户选择,切换当前活动菜单,或者结束程序。如果用户输入错误,需要提示用户重新输入。
这样,我们就实现了一个简单的菜单子系统,使用面向对象的程序设计思想,按照要求实现了菜单类、菜单管理类和具体的菜单对象。