Я разрабатываю приложение на C++, где мне нужно создать X количество классов. Скажем: класс AAA, BBB и CCC. Каждый класс соответствует одному типу объекта, который мне нужно будет обрабатывать. С другой стороны, у меня есть входной файл типа CVS. Одним из примеров этого входного файла выглядит следующим образом один:C++ 11 Создание объекта неизвестного класса
AAA,3432443,433434,11111,45678
AAA,8778776,786698,22222,86881
BBB,4452332,112234,34543,87734
Итак, мне нужно, чтобы разобрать, что входной файл, и в соответствии с первым элементом линии (AAA, BBB, CCC), мне нужно, чтобы создать соответствующий объект, который сохранит другие значения, найденные в строке. НО, я не могу «встроенный» в приложении возможные классы (AAA, BBB, CCC), с тем чтобы использовать цепочку условными, как: if (token == "AAA") then AAA aaa = new AAA (params);
Вместо:
- Приложение должно оставаться независимым от существующих классов, таким образом, чтобы в будущем мы могли добавлять классы DDD, EEE, ... ZZZ, не изменяя модуль, который создает объекты (в случае использования условных выражений я должен добавить, например:
if (token == "DDD") then DDD ddd = new DDD(params)
. Это запрещено . - Я создал файл конфигурации, который предоставляет возможные типы классов в текущем исполнении: AAA BBB CCC ... Таким образом, я могу перебрать эти типы классов и сравнить их с теми, которые считываются из первого элемента во входных строках файла. Но я застрял в проблеме того, как я могу создать объект неизвестного класса. Что-то вроде этого:
retrieved_type_from_input_file object = new retrieved_type_from_input_file(params);
где «retrieved_type_from_input_file» является переменной, которая содержит эффективный тип класса я должен создать: AAA ... ZZZ - Я имею в виду, в обобщенном программировании. Что-то вроде:
T object = new T(params);
Но даже если я могу закодировать это внутри класса; в реализации мне нужно настоящее имя класса. - Я также думаю о реализации какого-либо шаблона Factory, создающего абстрактный абстрактный родительский класс («Thing»), из которого все будут наследовать (класс AAA: public Thing). Но все модели, которые я нахожу, прямо указывают на имя класса, в некотором месте кода, в момент создания объекта.
Любая помощь пожалуйста? Большое спасибо!
Посмотрите «заводской шаблон». – Peter
Если вы можете сделать некоторое форматирование, это упростит чтение. Благодарю. –
C++ не имеет отражения. –