Мой первый язык — Javascript, но я начинаю изучать C ++. Одна из моих любимых вещей — доступ к свойствам с умными именами переменных, используя квадратную скобку в Javascript, например:
var a = "prop";
var obj = {
this.prop : "before"};
function alterObj(a){
obj[a] = "after";
}
В моих книгах по С ++ этого не происходит, и у меня возникают проблемы с поиском в Google. Так как же динамически выбирать имена свойств в 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 ++. Но вы все равно можете работать с указателями или использовать макросы препроцессора.