简单地说,你可以”不要以一般的方式去做;根据运行时的名称无法访问成员变量。
这通常是通过创建的if-else链解决(或交换机),它允许你转换数据到信息:
char type;
float height;
int age;
cin >> type;
switch(type) {
case 'h': cin >> height; break;
case 'a': cin >> age; break;
}
这是不灵活,但这样是你的阶级结构,对?如果你想让它变成动态的,像@ riv的回答那样创建绑定是没有意义的;班级的任何变化都需要适当的条款。这将是更好地简单地决定,有些字段是动态存储地图:
class C {
int iAlwaysHaveThat;
map<variant<int,float,string>> dynamicValues;
};
这样,你可以解析配置文件,如:
Obj [
a = 5,
b = 3.14,
name = "some string value"
]
然后通过(根据实际需要访问它们)函数返回optional
:
optional<variant<...>> getDynamicValue(string const& name) { ... }
这也可能填补违约基础上一些其他的对象,例如:
{
// ...
auto v = dynamicValues.find(name);
if (v == dynamicValues.end())
return defaultValuesProvider.getDefault(name);
// ...
}
这是一个可能对某些用途实际上有用的解决方案,但是我可能会嵌入脚本语言。
我还是有点迷路。这将如何改变对象的价值? – user2424954
@ user2424954,把它想象成一个散列,你可以从字符串中访问你的属性。 – Lefsler
所以在我的情况下,我会做一些像框a;属于MapData [名称] =值; a.mapData [name] = value?对于特定的问题,我很抱歉,我对C++ – user2424954