0

つまり、基本クラス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);
4

6 に答える 6

4

短い答え: いいえ

長い答え:

ファクトリ オブジェクト/メソッドが必要です。
適切なオブジェクト タイプを作成する静的ファクトリ メソッドを基本クラスに追加できます。

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

個人の好み:

基本クラスで静的メソッドを使用するのではなく、完全に異なるクラスをファクトリとして使用します。この理由は、新しい Shape クラスを作成するたびに、上記のスタイルでは毎回 Shape クラスを再構築する必要があるためです。

したがって、ファクトリを ShapeFactory クラスに分離します。

于 2009-07-09T16:40:13.323 に答える
1

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

問題は、 new shape(...) を実行すると、長方形ではなく、常に形状のインスタンスが返されることです。「長方形」が必要な場合は、ある時点で、新しい長方形(..)を呼び出す必要があります。メソッドはこのロジックを処理できますが、C++ の既定の構造は処理できません。

于 2009-07-09T16:41:45.147 に答える
0

コンストラクターを呼び出すと、常にコンストラクターの型のオブジェクトが提供されます。

new shape(...)

代わりに、必要に応じて任意のサブタイプを作成できる形状の静的メソッドがあるファクトリ デザイン パターンを使用したいと思います。

于 2009-07-09T16:40:51.497 に答える
0
shape *pRectangle = new shape(RECTANGLE);

基本オブジェクトを作成して派生クラスを作成する方法はありません。派生クラス自体を新しくする必要があります。

于 2009-07-09T16:41:36.707 に答える
0

C++ では、動的キャストを使用してこれを実現できますが、いいえ、コンストラクター内からではありません。ファクトリメソッドで上記のように使用します

たとえば、http ://www.cprogramming.com/reference/typecasting/dynamiccast.html を参照してください。

于 2009-07-09T16:45:10.723 に答える