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
相关产品推荐
相关产品推荐

