我的第一门语言是Javascript,但我开始学习c++。我最喜欢做的一件事是使用Javascript中的方括号符号访问具有聪明变量属性名的属性,如下所示:
var a = "prop";
var obj = {
this.prop : "before"
};
function alterObj(a){
obj[a] = "after";
}
它似乎没有出现在我的c++书中,我在谷歌上搜索它时遇到了麻烦。那么如何在c++中动态选择属性名呢?
简短的回答是在c++中无法做到这一点。c++和javascript的主要区别在于c++是编译语言,而javascript不是。Javascript有很多简洁的运行时特性可供你使用,比如你可以使用括号符号来访问属性
obj["property"]
允许将任何类型的字符串放在括号中,然后在运行时求值。然而,c++没有这么大的运行时(有一个非常强大的运行时,但以不同的方式强大)。
现在说了这么多,如果你想实现一个功能,像你的alterObj
上面,你可以使用map
类。也可以重载[]
操作符。下面的代码片段给出了一个示例:
#include <iostream>
#include <map>
class SpecialObject {
public:
std::string operator[](std::string key);
};
std::string SpecialObject::operator[](std::string key) {
std::string retVal = key + " whoa!";
return retVal;
}
void modify(std::map<std::string, std::string> &obj) {
obj["something"] = "someone else";
}
int main(int argc, const char *argv[]) {
std::map<std::string, std::string> obj;
obj["something"] = "someone";
modify(obj);
std::cout << "obj["something"] = " << obj["something"] << std::endl;
SpecialObject obj2;
std::cout << "obj2["The clowns say"] = " << obj2["The clowns say"] << std::endl;
return 0;
}
map
对象允许您为其他对象创建一个简单的容器(在某种意义上完全像javascript对象一样),SpecialObject
类显示了您如何自己实现[]
操作符。
c++是一种编译语言。大多数类、变量、属性、枚举和函数的名称都不会进入最终的二进制文件,它们在编译时被处理并转换成内存偏移量以供最终机器代码使用。
这样的命名引用几乎是完全丢失的,只能用调试数据进行回溯。
长话短说,在C或c++中没有办法做到这一点。但是您仍然可以使用指针或使用预处理器宏。