class — C ++: Использование наследования, когда не все производные классы известны заранее?

Возможный дубликат:
Есть ли способ создания объектов из строки, содержащей их имя класса?

Я работаю над проблемой в некотором коде C ++, который имеет базовый класс InputFileи ряд производных классов: TxtInputFile, ASCInputFileи т. д., где каждый производный класс является конкретным типом ввода.

Я хотел бы иметь возможность извлечь переменную из командной строки и затем сгенерировать правильный объект производного класса для работы с указанным типом файла (например, указанным пользователем). TXT от командной строки, поэтому я генерирую TXTInputFile возразить и вернуться под InputFile метка для использования в остальной части программы).

Я мог бы сделать это с помощью строки IF / ‘ELSE`, сравнивая пользовательский ввод с кучей заранее определенных файловых кодов, но я бы хотел иметь возможность добавить поддержку новых типов файлов в будущем без редактирования строки операторов if и добавления новых файловых кодов, и т.п.

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

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

(например. InputFile(string)TXTInputFile(string temp = "TXT"), ASCInputFile(string temp = ASC")… Я понимаю, что это формат значений по умолчанию для параметров, просто пытаюсь предложить, куда я шел с этим ходом мыслей.)

Заранее спасибо.

1

Решение

Не катите свой собственный анализатор, если синтаксический анализ вообще сложен. Есть много вариантов, начиная от старого режима ожидания lex / yacc (или flex / bison) и заканчивая Boost :: Spirit и ANTLR. Lex / yacc — это анализатор LALR, который генерирует код. Сгенерированный код немного сложен для отслеживания и отладки. Boost :: Spirit намного больше соответствует современным концепциям программирования, как и ANTLR. Основная идея заключается в том, что вы указываете грамматику и порядок ее обработки.

0

Другие решения

Вы можете сделать отображение (возможно, с std::map) от строк до заводских функций.

5

По вопросам рекламы [email protected]