让我们说我们有这堂课
class IntArray {
string name;
};
我们有这个驱动程序
int main(){
IntArray xe;
return 0;
}
基本上,我们如何通过构造函数将实例的名称“ xe”存储到数据成员“字符串名称”中?
答案 0 :(得分:6)
C ++不支持这样做。变量名称只是您作为开发人员所知道的。编译的程序没有它们。 std::string name
内的class IntArray
字段将不包含“ xe”;只是未初始化。
但是,您可以使用映射-确切地说是std::unordered_map<std::string, IntArray> arrays
-然后使用arrays["xe"]
使用运行时定义的字符串访问所需的数组。有关详细信息,请参见std::unordered_map
。
答案 1 :(得分:1)
#include <string>
class IntArray
{
std::string name;
public:
IntArray(std::string name) : name{ std::move(name) } {}
};
int main()
{
IntArray xe{ "xe" };
}
答案 2 :(得分:1)
嗯,您有一些技巧可以解决您的问题。与其直接使用构造函数,不如使用一个宏,例如:
#define DECL(x) x(#x)
在应用程序中#include
的某个常见标头中。而不是声明
IntArray ex;
做
IntArray DECL(ex);
扩展时,您将得到类似的东西:
IntArray xe("xe");
您还可以使用最新标准的可变参数宏扩展来调用其他构造函数。
#define DECL(name, ...) name(#name, #__VA_ARGS__)
如果需要,还可以在宏中包括类型,因此:
#define DECL(type, name) type name(#type, #name)
并使用以下命令声明变量:
DECL(IntArray, ex);
它将扩展为:
IntArray ex("IntArray", "ex");
这个技巧还远远没有完成,但是可以帮助您避免因在源代码中必须两次编写变量名而导致拼写错误。