У меня сложная проблема, которую не удалось решить - надеюсь, до сих пор.Я разрабатываю свою собственную инфраструктуру и поэтому пытаюсь предложить пользователю гибкость со всей сложностью кода под капотом.
Прежде всего, у меня есть абстрактный базовый класс, который пользователи могут реализовать, очевидно упрощенный:
class IStateTransit
{
public:
bool ConnectionPossible(void) = 0;
}
// A user defines their own class like so
class MyStateTransit : public IStateTransit
{
public:
bool ConnectionPossible(void){ return true; }
}
Далее я определяю фабричный класс.Пользователи могут зарегистрировать свои собственные объекты транзита состояний и обращаться к ним позже, просто используя выбранный ими строковый идентификатор:
class TransitFactory : public Singleton<TransitFactory>
{
public:
template<typename T> void RegisterStateTransit(const string& name)
{
// If the transit type is not already registered, add it.
if(transits.find(name) == transits.end())
{
transits.insert(pair<string, IStateTransit*>(name, new T()));
};
}
IStateTransit* TransitFactory::GetStateTransit(const string& type) const
{
return transits.find(type)->second;
};
private:
map<string, IStateTransit*> transits;
}
Теперь проблема (вероятно, очевидно) заключается в том, что всякий раз, когда пользователь запрашивает транзит, вызываяGetStateTransit
система в настоящее время продолжает возвращать один и тот же объект - указатель на тот же объект, который есть.Я хочу изменить это.
ПРОБЛЕМА: Как я могу вернуть новый (клон) исходного объекта IStateTransit
без необходимости определения пользователем собственного конструктора копирования или виртуальный конструктор .В идеале мне бы хотелось, чтобы метод GetStateTransit
мог приводить объект IStateTransit к производному типу, который находится во время выполнения, и возвращать клон этого экземпляра.Самым большим препятствием является то, что я не хочу, чтобы пользователю приходилось реализовывать какие-либо дополнительные (и, вероятно, сложные) методы.
4 часа поиска в Google и попыток ни к чему не привели.Тот, у кого есть ответ, герой!