我對問題標題不滿意,但我無法很好地描述它。爲了簡潔起見,我將這些實現放在類聲明中。在抽象基類中使用抽象類成員的最佳方法?
我有這樣一個類:
class VisibleObject {
public:
void draw(sf::RenderWindow& rw) {
rw.draw(*shape.get());
}
virtual void setSize(sf::Vector2f) = 0;
protected:
std::shared_ptr<sf::Shape> shape;
}
sf::Shape
是一個抽象類。然後,我有一個派生類,像這樣:
class Brick : VisibleObject {
Brick() {
shape.reset(new sf::RectangleShape());
}
void setSize(sf::Vector2f newSize) {
std::dynamic_pointer_cast<sf::RectangleShape>(shapes).get()->setSize(newSize);
}
}
sf::RectangleShape()
是一個具體的類,從sf::Shape
和setSize()
繼承了它的定義,不sf::Shape
,這就是爲什麼我要投。
當然,如果動態轉換失敗並返回一個空的shared_ptr,我需要做一些錯誤處理。
我這樣做是因爲我想能夠定義draw
方法一次,因爲在這個簡單的遊戲中,每個對象都會以這種方式繪製其成員。最初,我把這個形狀留在了基類之外,例如Brick只會擁有自己的專用sf::RectangleShape
,可以在堆棧上實例化;這是乾淨的,但然後繪製方法必須重寫爲每個對象類型。
這種方法很有效,但更難以使用並引入了堆分配。我也有shared_ptr
開銷(我會用unique_ptr
,但我需要動態鑄造)。
這是做我想做的最合適的方式嗎?
嘿,我是新手!實際上這是一個有吸引力的解決方案我避免了一個成員Shape的混亂,同時避免重複。謝謝。 – esel
@esel還有另一種選擇,把我的答案和Kerrek的混合起來。 – Casey