Вы не должны быть здесь. В вашей цепочке if-else вы создаете общий указатель на соответствующий тип, а затем возвращаете этот shared_ptr
. Он автоматически преобразуется в std::shared_ptr<Character>
, как вы получаете, когда у вас есть
Character * character = new Enemy(...);
Это означает, что ваша функция должна выглядеть примерно так:
std::shared_ptr<Character> CharacterFactory::createCharacter(Character::Type type, Character::SubType subtype, const TextureHolder &textures, sf::Vector2u windowSize) {
if ( type == Character::enemy ) {
return std::make_shared<Enemy>(subType, textures, windowSize);
} else if(type == Character::player) {
return std::make_shared<Player>(subType, textures, windowSize);
}
return {}; // return null on bad type
}
Мы можем применить несколько твиков к вышеприведенному, чтобы сделать его более производительным, а не просто молча возвращать нулевой указатель, если фабрика получила плохой type
. Для этого мы будем использовать std::unique_ptr
и выбрасывать исключение, если получим плохой type
. std_unique_ptr
можно преобразовать в std::shared_ptr
, так что это позволяет вашей фабрике по умолчанию работать с обоими типами интеллектуальных указателей. Это дает нам
std::unique_ptr<Character> CharacterFactory::createCharacter(Character::Type type, Character::SubType subtype, const TextureHolder &textures, sf::Vector2u windowSize) {
if ( type == Character::enemy ) {
return std::make_unique<Enemy>(subType, textures, windowSize);
} else if(type == Character::player) {
return std::make_unique<Player>(subType, textures, windowSize);
}
throw std::runtime_error("bad type passed to factory");
}