与抽象基类中的抽象类成员一起工作的最佳方法?

缺点

我对问题标题不满意,但无法很好地描述它。为了简洁起见,我将实现放在类声明中。

我有一个这样的课:

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::ShapesetSize()为其定义,而不是sf::Shape,这就是为什么我需要强制转换。

当然,在动态转换失败并返回空的shared_ptr的情况下,我需要进行一些错误处理。

之所以这样做,是因为我希望能够draw一次定义该方法,因为在这个简单的游戏中,每个对象都将以这种方式绘制其成员。最初,我将形状保留在基类之外,例如Br​​ick拥有自己的私有对象sf::RectangleShape,可以在堆栈中实例化该私有对象这很干净,但是随后必须针对每种对象类型重新编写draw方法。

这可行,但使用起来较麻烦,并引入了堆分配。我也有shared_ptr开销(我会用过unique_ptr,但我需要动态转换)。

这是做我想做的最合适的方法吗?

凯西

除了不要求在中存储std::shared_ptr<sf::Shape>,为什么不简单地引入一种sf::Shape&从具体类中检索的方法

class VisibleObject {
    virtual sf::Shape& getShape() = 0;
public:
    void draw(sf::RenderWindow& rw) {
        rw.draw(getShape());
    }
    virtual void setSize(sf::Vector2f) = 0;
};

class Brick : VisibleObject {
    sf::RectangleShape shape;
    sf::Shape& getShape() override { return shape; }
public:
    void setSize(sf::Vector2f newSize) override {
        shape.setSize(newSize);
    }
};

当您只可以存储一个普通的旧成员时,通过指向基础的指针进行存储似乎很荒谬,从而引入了间接寻址和向下转换以及引用计数开销。实际上,如果我正确地理解了该问题,则可以使用模板来生成具体的类,并避免大量重复使用:

class VisibleObject {
public:
    virtual ~VisibleObject() {}
    virtual void draw(sf::RenderWindow&) = 0;
    virtual void setSize(sf::Vector2f) = 0;
};

template <typename Shape>
class VisibleConcreteObject : public VisibleObject {
    Shape shape;
public:
    void draw(sf::RenderWindow& rw) override /* final? */ {
        rw.draw(shape);
    }
    void setSize(sf::Vector2f newSize) override /* final? */ {
        shape.setSize(newSize);
    }
};

typedef VisibleConcreteObject<sf::RectangleShape> Brick;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将wicket CompoundPropertyModel与抽象类一起使用

来自分类Dev

重载抽象类中的抽象方法

来自分类Dev

抽象类中的抽象方法

来自分类Dev

非抽象类中的抽象方法

来自分类Dev

在Python中实现抽象类的最佳方法

来自分类Dev

特定基类的抽象类的C ++ Vector,作为另一个类成员

来自分类Dev

抽象类中受保护的抽象或公共抽象方法

来自分类Dev

将MEF与抽象基类一起使用

来自分类Dev

toString() 定义在抽象类的私有成员上,那么为什么打印子类对象会与抽象类的私有成员一起打印?

来自分类Dev

使用子非抽象类向抽象类中的非抽象方法插入值

来自分类Dev

抽象类中的重写方法

来自分类Dev

如何调用抽象类中的方法

来自分类Dev

java中抽象类中的抽象方法

来自分类Dev

抽象类和基类一样吗?

来自分类Dev

从抽象基类创建子类的最佳方法

来自分类Dev

非抽象类中的抽象方法反之亦然

来自分类Dev

在抽象类java中调用非抽象方法

来自分类Dev

内部抽象方法在抽象类中的用途是什么?

来自分类Dev

如何在抽象类中调用非抽象方法?

来自分类Dev

我试图在一个类中实现抽象类和接口,并且仅调用了接口成员,而抽象方法没有?

来自分类Dev

没有抽象类的抽象方法

来自分类Dev

从抽象类测试子类的抽象方法

来自分类Dev

抽象类的抽象方法的部分实现

来自分类Dev

防止暴露基类(抽象类)

来自分类Dev

从抽象类继承方法

来自分类Dev

为什么@DiscriminatorValue JPA注释不能与抽象类一起使用?

来自分类Dev

在Scala中将抽象类型与类型类一起使用

来自分类Dev

在Symfony中将抽象类和接口与ORM一起使用,找不到接口

来自分类Dev

接口,抽象类和抽象类的方法

Related 相关文章

热门标签

归档