在dynamic_pointer_cast后调用派生类的构造函数
call constructor of a derived class after a 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");
}
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- QWidget::p aintEngine:不应再在 QTreeWidget 派生类中调用
- 调用从模板派生的类的静态方法,而不指定模板
- 调用派生类成员函数
- 从基类实例调用派生类方法而不进行强制转换
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 从 c++ 中派生类的析构函数调用虚函数
- 从基类 (C++) 调用派生类中的非虚函数
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何从 Gtk::窗口调用派生对象的析构函数
- 在dynamic_pointer_cast后调用派生类的构造函数
- 如何使派生类函数在调用时始终调用相同的基类函数?
- C++初始化之前派生类调用基类的方法
- 为什么派生类的实例从基类调用方法?
- 从 Base 引用对象调用派生类的成员
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 基函数中的公共函数,当使用派生对象通过另一个基函数调用时,派生调用基函数