2016-08-28 3 views
-2

Учитывая гипотетическую ситуацию, как это:Как «составить» имена переменных в C++?

int val1, val2, val3, choice; 
while (expression) { 
    cin >> choice; 
    if (choice == 1) { 
     val1 += expression; 
    } else if (choice == 2) { 
     val2 += expression; 
    } else if (choice == 3) { 
     val3 += expression; 
    } else { 
     expressions..; 
    } 
} 

Есть ли способ, чтобы обработать имена переменных, как строки, чтобы иметь возможность «сочинять» их? Это может быть полезно, например, в приведенном выше примере или даже лучше в цикле for, добавляя значение счетчика к имени переменной, чтобы в каждом цикле вызывалась другая переменная.

С такой особенностью, мой пример выше стал бы что-то вроде:

int val1, val2, val3, choice; 
while (expression) { 
    cin >> choice; 
    if (choice == 1 || choice == 2 || choice == 3) { 
     ['val' + choice] += expression; 
    } else { 
     expressions..; 
    } 
} 

Я не думаю, что я выбрал лучший пример, чтобы представить преимущества такого признака, во всяком случае я использовал, чтобы сделать это много с PHP и SQL, используя, например, значение счетчика в цикле, чтобы каждый раз выбирать другой элемент массива и указывать его в новой инструкции SQL.

Кто-нибудь знает, возможно ли что-то подобное в C++?
Если что-то неясно, просто дайте мне знать.
Спасибо :)

+1

Вы явно упомянули массив в своем вопросе. C++ имеет массивы, как и любой другой язык. – chris

+0

Вы можете использовать Массивы –

+0

Да, я знаю. Я упомянул об этом, чтобы сделать другой пример того, как можно использовать такую ​​функцию. –

ответ

7

Попробуйте массив:

int vals[3] = {0}, choice; 
while (expression) { 
    cin >> choice; 
    if (choice >= 1 && choice <= 3) { 
     // arrays are indexed starting at 0 
     vals[choice-1] += expression; 
    } else { 
     // ... 
    } 
} 
1

Реальное решение является массивом. Но если вы действительно хотите, чтобы прикрепить другое имя вашего значения, вы можете использовать карту:

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

while (expression) { 
    cin >> choice; 
    if (choice == 1 || choice == 2 || choice == 3) { 
     vals[std::string{"val"} + choice] += expression; 
    } else { 
     expressions..; 
    } 
} 

Содержание карты может выглядеть примерно так:

"val1" -> 4 
"val2" -> 3 
"val3" -> 12 

карта со строками в ключи будут наиболее близкими к динамическим именам.

Но могу вас заверить, решение массива лучше в этом конкретном случае. Динамические имена - плохая идея и привыкают к статическому имени, если вы хотите C++.

1

Имена переменных - это время компиляции, а не объекты времени выполнения.

Очень часто возникает массив, когда вам нужно идентифицировать объекты по низким целым числам.

int val[3]; // val1, val2, val3 

// -1 because arrays are 0-based 
val[choice-1]; 

Вы можете использовать хэш-таблицу (называемый unordered_map), чтобы сделать то же самое со строками, как кто-то предложил. Но unordered_maps являются довольно тяжелыми объектами. Вы также можете использовать #defines и оператор # paste token, но не вставлять переменную. Только идентификаторы времени компиляции могут быть объединены с ##.

Смежные вопросы