2013-12-05 2 views
0

Мне интересно, как я могу задать имя экземпляра класса как переменной. Вот код, который я получил до сих пор:Как установить имя экземпляра класса переменной (C++)

char line; 
int A, B, C; 
cout << "Enter a name and an equation for the line (example: g 5 2 1):" << endl; 
cin >> line >> A >> B >> C; 
Line line; 
line.A = A; 
line.B = B; 
line.C = C; 
cout << line << ": " << A << "x + " << B << "y + " << C << " = 0" << endl; 
return 0; 

Излишне говорить - класс Line имеет переменные A, B и C.

Так, например - когда пользователь входит в «м 2 3 1 " Я хочу создать новую строку с именем экземпляра " m " и A = 2, B = 3, C = 1. Если пользователь должен был ввести «s 2 2 2» - создать экземпляр линии «s» с A = 2, B = 2, C = 2 и т. Д. И, может быть, позже, если пользователь добавит имя строки, которое уже существует, он получит сообщение об ошибке.

Итак, чтобы подвести итог, может ли кто-нибудь сказать мне правильный способ создания подобных экземпляров с динамическими именами?

Спасибо заранее:]

+0

Дайте ему поле «имя»? Вы также можете рассмотреть использование 'std :: map' или' std :: unordered_map'; это звучит так, будто вы пытаетесь использовать динамически называемые переменные, что обычно является плохим. – user2357112

ответ

0

Поскольку имена переменных только компилировать имена типов для взаимодействия человека с исходным кодом, вы не можете напрямую сделать это.

Проще всего было бы использовать карту (которая в основном является ассоциативным массивом, нет на самом деле это не является, но от того, что вам нужно знать для вашей проблемы есть), чтобы получить то, что вам нужно:

#include <map> 

std::map<string, Line> lines; 

Line line = Line(A,B,C) 
string name = "lineName"; 
lines[name] = line; 
... 
std::map<string,Line>::iterator it = lines.find(name); 
if (it != lines.end()) 
{ 
    const Line& line = it->second; 
    .. 
} 
0

Итак, чтобы подвести итог, может ли кто-нибудь сказать мне правильный способ создания подобных экземпляров с динамическими именами?

Вы не можете. Ближайший вы можете получить используя std::map:

std::map<std::string, Line> vars; 

int a = 0; 
int b = 0; 
int c = 0; 
std::string name; 
std::cin >> name >> a >> b >> c; 
vars.emplace(std::make_pair(name, Line { a, b, c })); 

Если ввести s 1 2 3 вы можете получить соответствующий Line объект с vars["s"].

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