在我的代码中,我使用了以下结构的多个结构:
struct Track {
string artist;
string cd;
// etc....
};
结构可以称为:Track1,Track2等。
我正在尝试创建一个使用变量来确定应该输出哪个成员的函数
例如:
string x ="cd"
cout << Track1.x << endl;
我无法弄清楚如何做到这一点......我不断得到'x'不是Struct的成员的错误。
感谢您花时间阅读本文,希望您能帮助我。
答案 0 :(得分:7)
C ++不是一种脚本语言,所以你不能做变量变量&#34;那样的。
通常的方法是使用地图:
std::map<std::string, std::string> myValues;
然后以下是相同的:
std::cout << myValues["cd"] << std::endl;
和
std::string x = "cd";
std::cout << myValues[x] << std::endl;
然而,我质疑你的设计。看起来轨道具有固定数量的属性,因此单个成员有意义,而不是可以添加和删除元素的地图。您可以限制对地图的访问并编写代码,以确保其始终存储所有轨道属性(而不是其他任何内容)。
但我建议重新考虑变量&#34;变量&#34;这里首先。将字符串传递给函数以确定其语义并不是特别有效,强大或有弹性。为什么不返回对整个Track
对象的引用,然后调用者可以检查他们想要的任何属性?
std::cout << getTrack(arguments...).cd << std::endl;
答案 1 :(得分:0)
无法通过运行时名称指定类成员。唯一的直接语言功能,允许用户通过运行时值指定一个类成员(即你把它放在&#34;使用一个变量来确定结构成员&#34;)是&#34;指针指向的指针-member&#34;型
Track track1 = { "Some Artist", "Some CD" };
Track track2 = { "Some Other Artist", "Some Other CD" };
std::string Track::*member = &Track::cd; // pointer-to-member points to 'cd' member
std::cout << track1.*member << std::endl;
std::cout << track2.*member << std::endl;
member = &Track::artist; // pointer-to-member points to 'artist' member
std::cout << track1.*member << std::endl;
std::cout << track2.*member << std::endl;
现在,如果您希望能够使用包含其名称的字符串(如原始帖子中)选择特定成员,则除了手动实现名称到成员映射之外别无选择。您可以使用上述指向成员的指针来构建此类映射
std::map<std::string, std::string Track::*> mapping = {
{ "artist", &Track::artist },
{ "cd", &Track::cd }
};
std::string Track::*member = mapping["cd"];
std::cout << track1.*member << std::endl;
std::cout << track2.*member << std::endl;