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

C++如何对不同类成员执行相同操作而不编写重复代码

你的需求可以通过映射表配合成员指针实现,原生C++不支持直接动态替换成员名,但有成熟的替代方案:


方案1:成员指针+字符串映射表(最贴合需求,无需修改原有Farm类结构)

只需要维护一份字符串到类成员指针的映射表,不需要写N个if判断,仅需一次查找就能定位到对应成员:

#include <iostream>
#include <string>
#include <unordered_map>

class Farm
{
public:
    int cows = 1;
    int chickens = 2;
    int mules = 3;
};

using namespace std;

void count_animals(const string& animal_type)
{
    // 静态映射表,仅初始化一次,新增成员只需要加这里的条目即可
    static const unordered_map<string, int Farm::*> member_map = {
        {"chickens", &Farm::chickens},
        {"cows", &Farm::cows},
        {"mules", &Farm::mules}
    };

    Farm* animal_farm = new Farm;
    // 仅1次查找判断,不需要多分支if
    auto it = member_map.find(animal_type);
    if (it != member_map.end()) {
        cout << animal_farm->*(it->second) << endl;
    }
    delete animal_farm; // 补充内存释放逻辑,避免泄漏
}

int main()
{
    string animals_to_count = "count my chickens";
    // 从输入参数里提取动物名称,可根据你实际的输入格式调整提取逻辑
    string animal_type = animals_to_count.substr(animals_to_count.find_last_of(' ') + 1);
    
    count_animals(animal_type);
    return 0;
}

方案2:封装[]运算符(调用更简洁)

把成员查找逻辑封装到Farm类内部,外部调用语法更直观:

class Farm
{
public:
    int cows = 1;
    int chickens = 2;
    int mules = 3;

    int operator[](const string& animal_type) const {
        static const unordered_map<string, int Farm::*> member_map = {
            {"chickens", &Farm::chickens},
            {"cows", &Farm::cows},
            {"mules", &Farm::mules}
        };
        auto it = member_map.find(animal_type);
        return it != member_map.end() ? this->*(it->second) : -1;
    }
};

// 调用示例
void count_animals(const string& animal_type) {
    Farm animal_farm;
    cout << animal_farm[animal_type] << endl;
}

方案3:直接用容器存储成员(适合成员频繁新增的场景)

如果成员数量多、经常迭代,可以直接把动物数据存在容器里,不需要单独声明每个成员变量:

class Farm
{
public:
    unordered_map<string, int> animals = {
        {"cows", 1},
        {"chickens", 2},
        {"mules", 3}
    };
};

// 调用示例
void count_animals(const string& animal_type) {
    Farm animal_farm;
    cout << animal_farm.animals[animal_type] << endl;
}

该方案优点是新增成员不需要修改任何映射逻辑,直接加容器条目即可;缺点是没有编译时名称校验,成员名拼写错误要到运行时才能发现。


内容的提问来源于stack exchange,提问作者Denis Shevchenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:45:05