如何在C++中实现类似Java的Enumeration枚举类
如何在C++中实现类似Java带构造函数和toString的枚举类
刚学习C++,正尝试将自己编写的Java应用转换为C++,但不清楚如何复刻Java中带有构造函数和toString()方法的Enumeration枚举类。以下是我的Java枚举示例、获取枚举实例的方法,以及我尝试编写的C++类代码,希望得到正确的实现方法:
Java枚举示例
public enum InteractionType { // 枚举值 PRINTACTIONS("Print Available Actions"), PRINTBANKNAME("Display Bank Name"), PRINTBANKACTIONS("Display Bank Actions"), CREATEBRANCH("Create a Branch"), CREATECUSTOMER("Create a Customer"), READBRANCH("Query Bank Branches"), READCUSTOMER("Query Customers and/or Customer Transactions"), UPDATEBRANCH("Update Branch Name"), UPDATECUSTOMER("Update Customer Information"), DELETEBRANCH("Delete Branch"), DELETECUSTOMER("Delete Customer"), QUITAPP("Quit Application"); // 私有成员变量 private final String description; // 构造函数 InteractionType(String description) { this.description = description; } // 重写toString方法 public String toString() { return description; } }
获取枚举实例的Java方法
private static InteractionType getSelectedAction() { // 创建包含所有枚举值的数组 InteractionType[] interactionTypes = InteractionType.values(); System.out.print("Select an action: "); int id = scanner.nextInt(); scanner.nextLine(); // 返回指定的InteractionType实例 return interactionTypes[id]; }
我尝试编写的C++代码
InteractionType.h
#include <iostream> #include <string> using namespace std; class InteractionType { public: static const InteractionType PRINTACTIONS(string = "Print Actions"); static const InteractionType PRINTBANKNAME(string = "Print Bank Name"); static const InteractionType PRINTBANKACTIONS(string = "Print Bank Actions"); static const InteractionType CREATEBRANCH(string = "Create a Branch"); static const InteractionType CREATECUSTOMER(string = "Create a Customer"); static const InteractionType READBRANCH(string = "Read Branches"); static const InteractionType READCUSTOMER(string = "Read Customers"); static const InteractionType UPDATEBRANCH(string = "Update a Branch"); static const InteractionType UPDATECUSTOMER(string = "Update a Customer"); static const InteractionType DELETEBRANCH(string = "Delete a Branch"); static const InteractionType DELETECUSTOMER(string = "Delete a Customer"); static const InteractionType QUITAPP(string = "Quit Application"); private: string description; InteractionType(string description); };
InteractionType.cpp
#include "InteractionType.h" const InteractionType InteractionType::PRINTACTIONS(string description) { return InteractionType(description); } const InteractionType InteractionType::PRINTBANKNAME(string description) { return InteractionType(description); } const InteractionType InteractionType::PRINTBANKACTIONS(string description) { return InteractionType(description); } const InteractionType InteractionType::CREATEBRANCH(string description) { return InteractionType(description); } const InteractionType InteractionType::CREATECUSTOMER(string description) { return InteractionType(description); } const InteractionType InteractionType::READBRANCH(string description) { return InteractionType(description); } const InteractionType InteractionType::READCUSTOMER(string description) { return InteractionType(description); } const InteractionType InteractionType::UPDATEBRANCH(string description) { return InteractionType(description); } const InteractionType InteractionType::UPDATECUSTOMER(string description) { return InteractionType(description); } const InteractionType InteractionType::DELETEBRANCH(string description) { return InteractionType(description); } const InteractionType InteractionType::DELETECUSTOMER(string description) { return InteractionType(description); } const InteractionType InteractionType::QUITAPP(string description) { return InteractionType(description); } InteractionType::InteractionType(string description) { this->description = description; }
正确的C++实现方案
你的尝试存在问题:每次调用静态方法都会创建新的InteractionType对象,无法保证枚举实例的单例性,也没法像Java那样获取所有枚举值的集合。下面是贴近Java枚举行为的实现:
1. 头文件(InteractionType.h)
#include <string> #include <vector> #include <iostream> class InteractionType { public: // 所有枚举实例(静态const单例) static const InteractionType PRINTACTIONS; static const InteractionType PRINTBANKNAME; static const InteractionType PRINTBANKACTIONS; static const InteractionType CREATEBRANCH; static const InteractionType CREATECUSTOMER; static const InteractionType READBRANCH; static const InteractionType READCUSTOMER; static const InteractionType UPDATEBRANCH; static const InteractionType UPDATECUSTOMER; static const InteractionType DELETEBRANCH; static const InteractionType DELETECUSTOMER; static const InteractionType QUITAPP; // 获取所有枚举实例的静态方法,对应Java的values() static const std::vector<const InteractionType*>& values(); // 对应Java的toString(),返回描述信息 const std::string& toString() const; // 重载==运算符,用于实例比较 bool operator==(const InteractionType& other) const; private: std::string description; // 私有构造函数,禁止外部创建新实例 explicit InteractionType(std::string desc); }; // 重载ostream运算符,方便直接输出枚举实例 std::ostream& operator<<(std::ostream& os, const InteractionType& type);
2. 实现文件(InteractionType.cpp)
#include "InteractionType.h" #include <vector> // 初始化所有静态枚举实例 const InteractionType InteractionType::PRINTACTIONS("Print Available Actions"); const InteractionType InteractionType::PRINTBANKNAME("Display Bank Name"); const InteractionType InteractionType::PRINTBANKACTIONS("Display Bank Actions"); const InteractionType InteractionType::CREATEBRANCH("Create a Branch"); const InteractionType InteractionType::CREATECUSTOMER("Create a Customer"); const InteractionType InteractionType::READBRANCH("Query Bank Branches"); const InteractionType InteractionType::READCUSTOMER("Query Customers and/or Customer Transactions"); const InteractionType InteractionType::UPDATEBRANCH("Update Branch Name"); const InteractionType InteractionType::UPDATECUSTOMER("Update Customer Information"); const InteractionType InteractionType::DELETEBRANCH("Delete Branch"); const InteractionType InteractionType::DELETECUSTOMER("Delete Customer"); const InteractionType InteractionType::QUITAPP("Quit Application"); // 初始化所有枚举实例的集合 const std::vector<const InteractionType*>& InteractionType::values() { static const std::vector<const InteractionType*> allValues = { &PRINTACTIONS, &PRINTBANKNAME, &PRINTBANKACTIONS, &CREATEBRANCH, &CREATECUSTOMER, &READBRANCH, &READCUSTOMER, &UPDATEBRANCH, &UPDATECUSTOMER, &DELETEBRANCH, &DELETECUSTOMER, &QUITAPP }; return allValues; } // 构造函数实现 InteractionType::InteractionType(std::string desc) : description(std::move(desc)) {} // toString方法实现 const std::string& InteractionType::toString() const { return description; } // ==运算符重载 bool InteractionType::operator==(const InteractionType& other) const { return this == &other; // 单例实例比较地址即可 } // ostream运算符重载,支持cout直接输出 std::ostream& operator<<(std::ostream& os, const InteractionType& type) { os << type.toString(); return os; }
3. 对应Java的getSelectedAction方法实现
#include "InteractionType.h" #include <iostream> #include <limits> const InteractionType& getSelectedAction() { const auto& allActions = InteractionType::values(); std::cout << "Select an action: "; int id; // 输入校验,确保输入有效索引 while (!(std::cin >> id) || id < 0 || id >= static_cast<int>(allActions.size())) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "Invalid input, please enter a valid index: "; } std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 清除换行符 return *allActions[id]; }
实现说明
- 单例性:所有枚举实例都是静态const对象,全局唯一,和Java枚举的实例特性一致。
- values()方法:返回包含所有枚举实例指针的vector,对应Java的
values()方法。 - toString():返回枚举的描述信息,也可以通过重载
operator<<直接用cout输出。 - 类型安全:类封装保证外部无法创建新的实例,避免非法枚举值。
内容的提问来源于stack exchange,提问作者TroyPilewski
相关产品推荐
相关产品推荐

