28

基本クラスがあります

class ShapeF
{
public:
    ShapeF();
    virtual ~ShapeF();

    inline void SetPosition(const Vector2& inPosition) { mPosition.Set(inPosition); }

protected:
    Vector2 mPosition;
}

明らかにいくつかの省略されたコードで、しかしあなたは要点を理解します。私はこれをテンプレートとして使用し、いくつかの楽しい(省略された)列挙型を使用して、使用している形状の種類を判別する方法を使用します

class RotatedRectangleF : public ShapeF
{
public:
    RotatedRectangleF();
    virtual ~RotatedRectangleF();
protected:
    float mWidth;
    float mHeight;
    float mRotation;
}

ShapeFは、ポジショニングと、タイプが何であるかを定義する列挙型でその役割を果たします。アクセサーとミューテーターはありますが、メソッドはありません。

ShapeFを抽象クラスにして、ShapeF型のオブジェクトをだれもインスタンス化しようとしないようにすることはできますか?

通常、これはShapeF内に純粋仮想関数を含めることで実行できます。

//ShapeF.h
virtual void Collides(const ShapeF& inShape) = 0;

ただし、現在、別のクラスで衝突を処理しています。すべてを移動することはできますが、純粋仮想関数を使用せずにクラスを抽象化する方法があるかどうか疑問に思っています。

4

3 に答える 3

52

純粋な仮想デストラクタを宣言して実装できます。

class ShapeF
{
public:
    virtual ~ShapeF() = 0;
    ...
};

ShapeF::~ShapeF() {}

これは、既に持っているものからの小さな一歩であり、ShapeF直接インスタンス化されるのを防ぎます。派生クラスを変更する必要はありません。

于 2013-01-31T17:33:18.393 に答える
27

保護されたコンストラクターを使用してみてください

于 2013-01-31T17:36:12.807 に答える