Динамическое создание имени переменной

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
SerjVarshavskiy
Сообщения: 1
Зарегистрирован: 04 ноя 2007, 13:15

04 ноя 2007, 13:24

День добрый.

например в perl есть возможность получить данные переменной,
имя которой находится в другой переменной (string)

perl:
$testVar = "YES!\n";
$strVarName = "testVar";
print "$$strVarName"; # YES!

подскажите, как подобное реализовать в Qt/C++ ?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

23 ноя 2007, 11:28

На С++ такого сделать нельзя по той причине, что информация об именах после сборки в релизе выполняемой программе просто отсутствует. Перл это позволяет по той причине, что это скриптовый язык, не предусматривающий компиляции в полном смысле этого слова.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Фоб
Сообщения: 45
Зарегистрирован: 10 ноя 2006, 14:56

11 дек 2007, 14:52

Правильно пишет Romeo.

Разве что добавлю, что с помощью макросов можно создать иллюзию динамического создания переменных.

Макросы в С++ - это вроде как функции, которые работают на этапе компиляции, формируя часть кода.

Например:

Код: Выделить всё

	#define defarr(t, name, j, n, v) t* name ## j = new t[n * j]; for (int i = 0; i < n * j; i++) (name ## j)[i] = v;

	defarr(int, m, 1, 5, 0);
	defarr(int, m, 2, 5, 0);
	defarr(int, m, 3, 5, 0);
На этапе компиляции вместо строк defarr(), появляется код создания массивов int m1[5], int m2[10], int m3[15], и заполнения их нулями.

А чтобы на этапе исполнения "получать данные переменной, имя которой находится в другой переменной", используйте указатели, и сможете "получать данные, адрес которых находится по другому адресу" (то же самое, но в терминах системного программирования).
Аватара пользователя
WinMain
Сообщения: 913
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

11 дек 2007, 16:05

На С++ можно сделать обращение к переменной по её строковому имени, если для этого использовать ассоциативные контейнеры, например std::map<>. Тогда в качестве ключевого параметра нужно указать класс строки, а хранимое значение будет того типа, который нас интересует, например:

std::map<std::string, int> _map;

_map["first"] = 1;
_map["second"] = _map["first"] + 1;
Ответить