2014-02-07 3 views
-1

Возможно, это было не очень ясно. Скажем, у меня есть char *a = "reg". Теперь я хочу написать функцию, которая при чтении значения a создает экземпляр объекта определенного класса и называет его reg.Как обрабатывать строковые переменные как действительный код?

Так, например, скажем, у меня есть class Register и отдельная функция create(char *). Я хочу что-то вроде этого:

void create(char *s) //s == "reg" 
{ 
    //what goes here? 
    Register reg; // <- this should be the result 
} 

Он должен быть многоразовым:

void create(char *s) //s == "second" 
{ 
    //what goes here? 
    Register second; // <- this should be the result 
} 

Я надеюсь, что я сделал себе ясно. По сути, я хочу рассматривать значение в переменной как отдельное имя переменной. Возможно ли это в C/C++? Если нет, ничего подобного? Мое текущее решение состоит в хэш-строке, и хэш-таблица будет хранить соответствующий объект Register в этом месте, но я полагал, что это было довольно необязательно.

Спасибо!

+0

Было бы удобно, если бы вы могли использовать эту строку в качестве ключа к какой-либо карте. Вы не согласны? – WhozCraig

+0

Вы не можете сделать это на C++, так как он не поддерживает динамизм в необходимой степени. Какова фактическая проблема, которую вы пытаетесь решить? –

+2

Почему? Почему вы позволили чему-то другому, кроме вас, программисту, определить, что ваши переменные _Called_? Вы выбираете свои var-имена, но как только код скомпилирован, имена исчезают (вроде) ... Я все равно не вижу смысла, но отвечаю: HashTable с 'hash',' char * 'и 'Регистрирующий' член звучит как разумная вещь ... –

ответ

2

Это невозможно. C++ не предоставляет никаких возможностей для обработки кода во время выполнения. Учитывая характер типичной реализации C++ (которая заранее компилирует машинный код, теряя всю информацию об исходном коде), это даже не возможно.

4

Имена переменных - это артефакты времени компиляции. Они не существуют во время выполнения. В C++ нет смысла создавать динамически называемую переменную. Как бы вы на это ссылались?

Допустим, вы имели эту гипотетическую create функцию, и написал такой код:

create("reg"); 
reg.value = 5; 

Это не компилируется, поскольку компилятор не знает, что reg относится к во второй строке.

C++ не имеет какой-либо способ посмотреть переменные во время выполнения, так создания их во время выполнения является неудачником. Хорошим решением для этого является хеш-таблица. Храните объекты в хеш-таблице и просматривайте их по имени.

2

Как я уже говорил в своем комментарии:
В чем смысл? Имя переменной - это что-то компилятор, но самое главное - вы, программист должен заботиться о нем. Как только приложение будет скомпилировано, имя переменной может быть любым ... это может быть искалечено и бессмысленно, это уже не имеет значения.
Вы читаете/пишите код, включая var-names. После компиляции это связано с аппаратным обеспечением, чтобы справиться с этим.

Ни С, ни С ++ имеют eval функции

Просто потому, что вы только скомпилировать все, что вам нужно, eval подразумевает ввод позже на том, что не может иметь никакого смысла, или требовать от других зависимостей.
C/C++ скомпилированы заранее, eval подразумевает оценку во время выполнения. Процесс C затем будет означать: предварительный процесс, компиляцию и связывание строки, таким образом, что она все еще является частью текущего процесса ...
Даже если это было возможно, eval всегда считается злым, что удваивается для языков, таких как семейство C, которые предназначены для надежной работы и часто используются для критических по времени операций. Правильный инструмент для работы и все такое ...

A HashTable с объектами, имеющими hash, key, Register, collision членов разумная вещь. В любом случае, это не так много накладных расходов ...

Все еще чувствуете, что вам это нужно?

Посмотрите на огромное количество скриптов языков, которые находятся там. Perl, Python ... Они все лучше подходят, чтобы сделать этот тип вещей

1

Если вам нужно переменное создание и поиск вы можете:

  • Используйте один из языков сценариев, как это было предложено другие
  • Сделайте поиск самостоятельно, самостоятельно. Самый простой подход - использовать карту, которая будет отображать строку в ваш объект register. И тогда вы можете иметь:
std::map<const char*, Register*> table; 

Register* create(const char* name) { 
    Register* r = new Register(); 
    table[name] = r; 
    return r; 
} 

Register* lookup(const char* name) { 
    return table[name]; 
} 

void destroy(const char* name) { 
    delete table[name]; 
    table.erase(name); 
} 

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

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