私は、パラメータをベースオブジェクトを構築することにより派生クラスからオブジェクトを作成できますか?

StackOverflow https://stackoverflow.com/questions/1105058

質問

言い換えれば、ベース・クラスshapeと派生クラスrectangle所与の

class shape
{
public:
  enum shapeType {LINE, RECTANGLE};
  shape(shapeType type);
  shape(const shape &shp);
}

class rectangle : public shape
{
public:
  rectangle();
  rectangle(const rectangle &rec);
}

私は呼び出すことでrectangleのインスタンスを作成することができれば知りたいのです。

shape *pRectangle = new shape(RECTANGLE);

とどのように私は呼び出して新しいrectangleを得るためには、コピーコンストラクタを実装することができます:

shape *pNewRectangle = new shape(pRectangle);
役に立ちましたか?

解決

短い答え:いいえ。

ロング回答:

あなたはファクトリオブジェクト/メソッドが必要です。
あなたはインクルードは、適切なオブジェクト型を作成し、基本クラスにstaticファクトリメソッドを追加することができます。

class Shape
{
    static Shape* createShape(shapeType type)
    {
        switch (type)
        {
             case RECTANGLE:return new rectangle();
           ...
        }
    }
 }; 

個人の好み:

私は工場ではなく、基本クラスの静的メソッドを使用してあることを完全に異なるクラスで行くだろう。この理由は、すべての時間はあなたが再構築Shapeクラスに上記のスタイルの力を毎回新しいShapeクラスを作成することです。

だから私はShapeFactoryクラスに工場を出てセパレータでしょう。

他のヒント

あなたは、コンストラクタ内から直接これを行うことはできません。代わりに、あなたは、このようなファクトリメソッドのよう別のアプローチを、使用する必要があります。

長方形ではない -

問題は、新しい形(...)を行うときに、あなたは常に形状のインスタンスを返します、です。あなたは「四角形」をしたい場合は、いくつかの点で、それは新しい矩形(..)を呼び出す必要があります。この方法は、C ++のデフォルトの建設、あなたのために、このロジックを処理しますが、できませんでした。

コンストラクタを呼び出すと、常にあなたのコンストラクタの型のオブジェクトを提供します。

new shape(...)

私はあなたが必要に応じて、任意のサブタイプを作成することができる形状の静的メソッドがある場合、代わりに工場出荷時のデザインパターンを使用したいと考えています。

shape *pRectangle = new shape(RECTANGLE);

あなたはベースオブジェクトを構築することにより派生クラスを作成する方法はありません。あなたは、派生クラス自体の新しいを行う必要があります。

は、C ++では、あなたはこれを達成するために、ダイナミックキャストを使用することができますが、ERM、ない、ない、コンストラクタ内から。ファクトリメソッドでは上記の暗示として使用してください。

例えば http://www.cprogramming.com/reference/typecasting/dynamiccastを見ます.htmlをする

あなたは、ポリシーベースのデザインでそのような何かを行うことができます。あなたのコードは

のようなものになるだろう
shape* pRectangle = new derrivedType<rectangle>();

ポリシーベースデザインする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top