Есть ли способ динамически создавать объекты на основе текстового файла? - PullRequest
0 голосов
/ 08 октября 2019

При создании приложения для симулятора я хотел бы иметь возможность сохранить / загрузить симуляцию, над которой я сейчас работаю, в текстовый файл. У меня есть стандарт для текстового файла, который по сути является CSV, где каждая строка соответствует компоненту моделирования, а первая запись каждой строки представляет собой строку, которая уникальным образом идентифицирует данный компонент. Я хотел бы иметь возможность анализировать этот текстовый файл и, в зависимости от этой первой записи, динамически создавать объект соответствующего типа компонента.

Все компоненты определены в своих собственных классах, которые начинаются с Base класс. результат этого анализа должен дать мне список Base указателей, которые являются полиморфными указателями на различные компоненты, анализируемые из текстового файла. Наиболее очевидным решением этой проблемы является использование гигантского if-else для анализируемого типа компонента:

Base* p;
if(type == "A"){
    p = new A();
} else if(type == "B"){
    p = new B();
} ...

Это очень утомительно. Поэтому мое следующее решение состояло в том, чтобы иметь карту, так что ключом записи является строка уникального идентификатора, а значением является указатель на функцию, которая возвращает полиморфный указатель на новый экземпляр соответствующего компонента. Таким образом, я могу просто проанализировать строку type из текстового файла и запустить строку, подобную этой:

Base* p = functionMap.at(type)();

Где каждая функция на карте имеет определение, которое выглядит следующим образом:

//Note that this doesn't need to be scoped off of each class, I've only 
//done this to make it clear that this function could be an overridden 
//function from the base class in the children if that brings a solution
Base* A::generate(){
    return new A();
}

Это все хорошо, но у меня нет способа добавить функцию generate для каждого компонента на карту, кроме insert, для каждого в основном, прежде чем я что-то еще сделаю. В этот момент я все еще буду жестко программировать для каждого компонента, и я мог бы просто использовать if-else.

Я был бы согласен с определением функции generate в каждом заголовке (несмотря на то, что все они былито же самое, и это фактически просто абстрагирование жесткого кодирования к нескольким файлам, а не к одному), если бы я мог автоматически зарегистрировать классы на карте.

Есть ли способ использовать решение карты указателя функции? Или, более того, есть ли способ добиться такого поведения в синтаксическом анализаторе, который не предусматривает жесткого кодирования для каждого компонента? Остальная часть программного обеспечения до сих пор адаптируется к любым новым компонентам, определенным автоматически, поэтому было бы неплохо не добавлять компоненты вручную каждый раз, когда я создаю новый.

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