0

親クラス A と 2 つの派生クラス A1 および A2 があります。

class A {

}

class A1 : public class A {}

class A2 : public class A {}

また、別のクラス BI では、オブジェクト A1 または A2 で構成されるコレクションを保持したいと考えています。

class B {
    vector<A1> _A1s;
    vector<A2> _A2s;

}

2 つの別々のベクトル A1s と A2s を保持するのではなく、これら 2 つのベクトルを結合する方法はありますか? ベクトルまたはベクトルを考えましたが、どちらの方法でも、A1 または A2 のサイズを変更するとオブジェクトが失われる可能性があります (私は推測します)。

何か案が?

4

3 に答える 3

3

基本型へのスマートポインタのベクトルを使用できます

std::vector<std::shared_ptr<A>> a_ptr;

注:仮想デストラクタをAに追加する必要があります

class A {
public:
  virtual ~A() {}
};

利用方法:

struct B {
public:
  B() {
    a_ptr.push_back(std::shared_ptr<A>(new A1));
    a_ptr.push_back(std::shared_ptr<A>(new A2));
  }

private:
  std::vector<std::shared_ptr<A>> a_ptr;
};

int main(int argc, char* argv[])
{
  B b;
  return 0;
}

また、クラス定義の後で見逃し;、以下のステートメントのAの前に追加のキーワードクラスがあります。

class A1 : public class A {};

する必要があります:

class A1 : public A {};
于 2013-01-08T09:51:40.077 に答える
0

ポインターのベクトルを使用できます

class B {
public:
    std::vector<A*>   _AXs;
};

A1 と A2 の両方のポインター型を受け入れます。

この場合、Aクラス virtual のデストラクタを設定する必要があることに注意してください。そうしないと、オブジェクトを削除しようとしたときにA*、プログラムは実際の型が何であるかを推測できません。

class A {
public:
    virtual ~A() {}    
};
于 2013-01-08T09:54:57.337 に答える
0

他の人が言っていることに加えて、基になるポインターをまたvisitorはとして引き続き使用できるようにする場合は、呼び出されるデザインパターンを使用できます。ビジター パターンは実際にはそのようには設計されていませんが、そのように使用すると便利です。AA1A2

于 2013-01-08T10:18:19.380 に答える