1

私は次のことをしているとしましょう

class Parent {
  protected: 
    virtual void overrideMe() = 0;
}

class ChildA : public Parent {
  protected: 
    void overrideMe() = 0{}
}

class ChildB : public Parent {
  protected: 
    void overrideMe() = 0{}
}

class UtilClass {
  public:
  vector<Parent> planes;
  void compute() {
    Parent& p = planes[0];
  }
}

この場合、UtilsClassのcompute()で、「親」を初期化できないというエラーが発生します。

私がやりたいのは、UtilClassの配列「planes」(ChildAまたはchildB、つまり非混合型)を埋めて、いくつかの計算を行うことです。

初期化中にポインターを使用する必要がありますか、それともテンプレートを使用するために使用する方がよいですか?使用をParentクラスの子のみに制限したいので、テンプレートの使用は必要ないとほぼ確信しています。

4

2 に答える 2

5

vector<Parent> planes;は存在できないため、意味がありParentません。抽象クラスです。ポインターのベクトル、またはさらに良いことに、スマートポインターを持つことができます。

抽象的でなくても、オブジェクトParentのベクトルはオブジェクトのスライスParentに悩まされ、ポリモーフィズムを壊してしまうため、おそらくあなたが望むものではありません。

class UtilClass {
  public:
  vector<Parent*> planes;
  void compute() {
    Parent& p = *planes[0];
  }
}
于 2012-07-30T18:11:34.317 に答える
2

あなたは持つことはできません

  vector<Parent> planes;

親クラスは抽象的であり、インスタンス化できないためです。あなたは次のようなものを利用する必要があります

  vector<Parent*> planes;

代わりに、この種の構文で派生クラスオブジェクトを作成することにより、Parentから派生したオブジェクトのベクトルが必要な場合

 Parent* pNewObject = new ChildB;
 planes.push_back(pNewObject)
于 2012-07-30T18:13:02.157 に答える