You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:30:28