Возможный дубликат:
Есть ли способ создания объектов из строки, содержащей их имя класса?
Я работаю над проблемой в некотором коде C ++, который имеет базовый класс InputFile
и ряд производных классов: TxtInputFile
, ASCInputFile
и т. д., где каждый производный класс является конкретным типом ввода.
Я хотел бы иметь возможность извлечь переменную из командной строки и затем сгенерировать правильный объект производного класса для работы с указанным типом файла (например, указанным пользователем). TXT
от командной строки, поэтому я генерирую TXTInputFile
возразить и вернуться под InputFile
метка для использования в остальной части программы).
Я мог бы сделать это с помощью строки IF
/ ‘ELSE`, сравнивая пользовательский ввод с кучей заранее определенных файловых кодов, но я бы хотел иметь возможность добавить поддержку новых типов файлов в будущем без редактирования строки операторов if и добавления новых файловых кодов, и т.п.
Есть ли способ получить доступ к какой-либо сгенерированной компилятором таблице всех производных классов к базовому классу во время выполнения?
Или, может быть, какой-то полиморфный конструктор, который динамически связан на основе того, что переданный параметр равен?
(например. InputFile(string)
… TXTInputFile(string temp = "TXT")
, ASCInputFile(string temp = ASC")
… Я понимаю, что это формат значений по умолчанию для параметров, просто пытаюсь предложить, куда я шел с этим ходом мыслей.)
Заранее спасибо.
Не катите свой собственный анализатор, если синтаксический анализ вообще сложен. Есть много вариантов, начиная от старого режима ожидания lex / yacc (или flex / bison) и заканчивая Boost :: Spirit и ANTLR. Lex / yacc — это анализатор LALR, который генерирует код. Сгенерированный код немного сложен для отслеживания и отладки. Boost :: Spirit намного больше соответствует современным концепциям программирования, как и ANTLR. Основная идея заключается в том, что вы указываете грамматику и порядок ее обработки.
Вы можете сделать отображение (возможно, с std::map
) от строк до заводских функций.