关于抽象类设计

时间:2014-03-27 13:23:46

标签: c++ abstract-class

我目前有这种结构,其中Collider是一个抽象类。

Collider class structure

我想创建另一个抽象类LevelObj,它应该有一个Collider。任何继承的LevelObj类,例如Wall,都必须进一步定义它需要哪一个碰撞器。然后我想创建一个容器Level的对象LevelObj。通过这种方式,我可以从Collider访问LevelObjLevel的所有功能。

然而,这种方法是不可能的,因为LevelObj不能保存抽象类。即使可能,我也无法改变'他的任何一个孩子中的对象Collider用于继承的LevelObj类。

有没有办法达到同样的效果?

2 个答案:

答案 0 :(得分:2)

您无法创建抽象类的实例。 ...但是您可以在抽象类中使用指针或指针式类型,在运行时指向派生类的实例(可以实例化,因为它们不是摘要)

所以你可以选择

  • 指针:您必须处理所有权,即谁必须负责创建/销毁该实例。
  • 参考:我觉得引用作为属性并不舒服。引用或多或少类似于指针,但它使用不同的语法...并且不能为null ...因此,您对引用对象的生命周期的控制必须更严格。
  • 更高级别(处理引用对象的生命周期),unique_ptr,shared_ptr ...

所有这些都可以指向任何派生类的实例...并将其作为抽象类访问

答案 1 :(得分:1)

  

然而,这种方法是不可能的,因为LevelObj不能容纳抽象类。

这当然是对的。但是,它可以保存指针或对抽象类对象的引用。实际对象可以嵌入到派生类中,如下所示:

class LevelObj {
public:
    Collider &collider;
protected:
    LevelObj(Collider &c) : collider(c) {}
};
class Wall : public LevelObj {
private:
    ColliderRect wallCollider;
public:
    Wall() : LevelObj(wallCollider) {}
};
class Fence : public LevelObj {
private:
    ColliderMesh fenceCollider;
public:
    Fence() : LevelObj(fenceCollider) {}
};

以上假设LevelObj的子类是&#34;已婚&#34;对他们的对手。如果不是这样,请在基数中使用unique_ptr<Collider>,并通过向基类提供指向已分配对象的指针,从派生类的构造函数初始化它。

  

然后我想创建一个容器Level

的对象LevelObj

由于LevelObj是多态的,如果级别对象不在级别之间(或在同一级别内)或{{},则应使用智能指针容器LevelObj - unique_ptr<LevelObj> 1}}如果以任何方式共享级别对象。