在 dynamic_pointer_cast 之后调用派生 class 的构造函数
call constructor of a derived class after a dynamic_pointer_cast
我正在尝试实现字符工厂,但我不明白如何为虚拟基础 class 创建通用 shared_ptr 然后将其转换为派生的 class 在构造函数中使用参数。
在我的示例中,我的虚拟基础 class 不能在构造函数中使用参数,但我需要在派生 class.
的构造函数中使用它们
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 链中,您所做的是创建一个指向适当类型的共享指针,然后 return 即 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
}
我们可以对上面的代码应用几个 tweeks 来提高它的性能,并且如果工厂传递了一个错误 type
则不只是默默地 return 一个空指针。为此,我们将使用 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");
}
我正在尝试实现字符工厂,但我不明白如何为虚拟基础 class 创建通用 shared_ptr 然后将其转换为派生的 class 在构造函数中使用参数。 在我的示例中,我的虚拟基础 class 不能在构造函数中使用参数,但我需要在派生 class.
的构造函数中使用它们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 链中,您所做的是创建一个指向适当类型的共享指针,然后 return 即 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
}
我们可以对上面的代码应用几个 tweeks 来提高它的性能,并且如果工厂传递了一个错误 type
则不只是默默地 return 一个空指针。为此,我们将使用 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");
}