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

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

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

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

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

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

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

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

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


person LiamK    schedule 01.10.2012    source источник


Ответы (2)


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

person David Hammen    schedule 01.10.2012
comment
Я даже не рассматривал парсер, просто бегло взглянув на ANTLR, похоже, что он отлично справится со своей задачей. Немного больше накладных расходов, чем хотелось бы, но я не уверен, что есть способ обойти это. - person LiamK; 01.10.2012

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

person Ben Voigt    schedule 01.10.2012