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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在dynamic_pointer_cast之后调用派生类的构造函数相关的知识,希望对你有一定的参考价值。

我正在尝试实现一个字符工厂,但我无法理解如何创建一个通用的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");
}

以上是关于在dynamic_pointer_cast之后调用派生类的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

[c++]dynamic_pointer_cast用于shared_ptr之间类型的转换,基类需要有虚函数

移动智能指针两次与复制

为啥在 setState 之后调用 getDerivedStateFromProps?

在原始方法调用之后提取方法并插入调用

在 Swift 中的 presentViewController 之后调用 pushViewController

viewWillAppear 调用但 viewDidAppear 在 pushViewController 之后未调用