私は、パラメータをベースオブジェクトを構築することにより派生クラスからオブジェクトを作成できますか?
-
12-09-2019 - |
質問
言い換えれば、ベース・クラス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>();