2

私はC++を初めて使用するので、アドバイスをもらいたいと思います。同じオブジェクトの配列を含むがサイズが異なる2つのクラスを作成しています。どちらのクラスにも配列を処理するための同じメソッドがありますが、それぞれに独自の動作があります。そのため、配列とその操作を表す新しいクラスを作成し、これら2つのクラスで拡張させたいと思います。

例えば:

Class classA{
     Person* persons[5];
     string className;
     ...
}

Class classB{
     Person* persons[15];
     int integerForClassB;
     string className;
     ...
}

pesrons配列のみを処理し、classAがparentClass(サイズ5の配列)を拡張し、classBがparentClass(サイズ15の配列)を拡張するように、クラスparentClassを定義するための最良の(最も推奨される)方法は何ですか?

4

3 に答える 3

0

このようなものは役に立ちますか?PersonタイプのSTLベクトルを使用して、基本クラスに人の数をカウントさせることができます。次に、各派生クラスは、m_personsベクトルのサイズが異なる基本クラスコンストラクターを呼び出します。次に、それぞれの場合のベクトルは、デフォルトで初期化されたPersonのインスタンスで要求されたサイズに満たされます。

含む

class Person
{
};

class ParentClass
{
public:
    // Relies on Person having a default constructor
    ParentClass( int personCount ) : m_persons( personCount )
    {
    } 
    
private:
    std::vector<Person> m_persons;
};

class ClassA : public ParentClass
{
public:
    ClassA() : ParentClass(5)
    {
    }
};

class ClassB : public ParentClass
{
public:
    ClassB() : ParentClass(15)
    {
    }
};
于 2012-06-29T20:41:56.793 に答える
0

配列処理クラスを拡張する必要がありますか?たぶん、ClassAとClassBのそのクラスを使用する方が良いでしょう。継承よりも構成を優先する

アレイが必要ですか?他の人が言っているように、std::vectorの方が良いかもしれません。

配列が必要な場合、テンプレートの使用を考えましたか?クラステンプレートは、次のような整数引数を持つことができます

template <int npersons> class PersonHandler {
    Person* persons[npersons]
}

したがって、PersonH​​andler <5>からClassAを継承し、PersonH​​andler<15>からClassBを継承できます。ただし、PersonClassはClassAとClassBでは異なるクラスであることに注意してください。

于 2012-06-29T21:01:24.403 に答える
0

質問に基づいて、私の考えは、継承を使用しないことが最善の方法であるということです。継承を使用publicしてクラス階層を定義します。多くの場合、合成が優れたオプションであるため、コードの再利用の手段として使用する場合は十分に注意してください。

  • コメントで示唆されているように、を検討してstd::vectorください。
  • std::vector必要な操作がすべて揃っていない場合は<algorithms>、ニーズを満たしているかどうかを確認してください。
  • それでもニーズが満たされない場合は、コレクション操作をメンバー関数ではなくフリー関数として作成することを検討してください。適切なデカップリングを使用すると、これらの操作は、std::vector<Person>またはの配列で機能しPersonます。
  • 非常に特殊な動作のコレクションが必要な場合は、Personscompositionを使用してください。質問の説明は、構成が正しいことを意味します:「両方の配列を含む2つのクラス...」

継承に関して、is-classAコレクション-ofPersonsおよびis-classBコレクション-ofの場合、動作が異なる共通メソッドのセットが前提条件と事後条件の共通セットを維持できる場合は、継承Personsを検討します。publicたとえば、とを考えてみましょEllipseCircle

class Ellipse
{
  // Set the width of the shape.
  virtual void width( unsigned int );

  // Set the height of the shape.
  virtual void height( unsigned int );
};

class Circle
{
  // Set the width of the shape.  If height is not the same as width, then
  // set height to be equal to width.
  virtual void width( unsigned int );

  // Set the height of the shape.  If width is not the same as height, then
  // set width to be equal to height.
  virtual void height( unsigned int );
};

Circleから派生したことは非常に魅力的Ellipseです:

  • プログラミング以外では、aが特別な種類であるのと同じように、それはCircle特別な種類であると主張することができます。EllipseSquareRectangle
  • それらは同じメンバー関数を持っています:width()height()

ただし、それをしないでください! 幅や高さが異なるなどEllipse、できないことを実行できます。CircleしたがってCircle、一種の。であってはなりませんEllipse

于 2012-06-29T21:10:07.920 に答える