Cześć,
Natknąłem się na problem slicing'u obiektów przechowywanych w vectorze jako wskaźniki, natomiast sam vector znajduje się w klasie bazowej:
class ModelC : public sf::Drawable
{
public:
void CreateCircle( const float radius = 0 );
void CreateRectangle( const sf::Vector2f &size = sf::Vector2f( 0, 0 ) );
private:
std::vector<std::unique_ptr<sf::Shape>> shapes;
};
Jak widać przechowuję typ ogólny sf::Shape
, jednak wrzucam tam typy pochodne jak właśnie na przykład koło i czworobok (sf::CircleShape
i sf::RectangleShape
).
Problem jest prosty, ale jednak zablokował mnie już na dość długo i najwidoczniej o czymś nie wiem:
Jeśli teraz klasa sf::CircleShape
posiada metodę setRadius()
, ale klasa sf::RectangleShape
już nie, to jak (albo: czy w ogóle) mogę iterując po vectorze zmieniać rozmiar/średnicę elementu, jeśli jest on rozpoznany jako sf::Shape
:
void PlayerC::SetSize( const float size )
{
for( auto it = shapes.begin(); it != shapes.end(); ++it )
{
it->get()->setRadius( size ); // NIE
}
}
stackoverflow mówi mi jedynie, że uniknięcie slicingu można uzyskać przez użycie wskaźników, ale takie rozwiązanie jest już od początku. Czy to w ogóle nadal problem slicing`u? Może jednak problem leży w architekturze?
Jak rozpoznać "pochodny" typ obiektu, który wyciągam z vector'a przechowującego typ bazowy?