在dynamic_pointer_cast后调用派生类的构造函数

call constructor of a derived class after a dynamic_pointer_cast

本文关键字:派生 调用 构造函数 dynamic pointer cast      更新时间:2023-10-16

我正在尝试实现一个字符工厂,但我无法理解如何为虚拟基类创建一个泛型shared_ptr,然后将其转换为构造函数中带有参数的派生类。 在我的示例中,我的虚拟基类不能在构造函数中接受参数,但我需要在派生类的构造函数中获取参数。

std::shared_ptr<Character> CharacterFactory::createCharacter(Character::Type type, Character::SubType subtype, const TextureHolder &textures, sf::Vector2u windowSize) {
std::shared_ptr<Character> character;
if ( type == Character::enemy ) {
std::dynamic_pointer_cast<Enemy>(character)(subType, textures, windowSize);
} else if(type == Character::player) {
//cast to player ...
}
return character;

可能这是一个设计问题,我无法解决。我不能使用原始指针,如果可以的话,我认为

character = new Enemy(...);

本来可以工作的。我找到的所有用于强制转换的示例都使用默认构造函数。

谢谢你的帮助

你不应该在这里投掷。 在您的 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
}

我们可以对上述内容应用一些 tweek 以使其性能更高,并且如果工厂传递了错误的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");
}