0

背景を説明させてください。Foo という抽象クラスがあります。

class Foo {
public:
    virtual void bar() = 0;
}

このクラスから継承する 2 つのクラスがあります。

class FooOne : public Foo {
public:
    void bar();
}

class FooTwo : public Foo {
public:
    void bar();
}

まったく別のクラスで、これら 2 つのクラスのいずれかのインスタンスを保持できる関数で配列を作成したいと考えています。私が直面している問題は、このような動的な型の配列を作成できないことですよね? type のオブジェクトを作成できる Objective-C に慣れていますid

理想的には、これは私が探していたものです (疑似コード):

void someFunction(FooType type) {
    class aClass = (type == FooTypeOne ? FooOne : FooTwo);
    vector<aClass> container;

    // Do something with the container.
}

注: このプロジェクトでは C++11 を使用できません。

4

2 に答える 2

3

STL コンテナーでスマート ポインターを使用できます。

Foo* MakeFoo(FooType type)
{
  switch(type)
  { 
  case FooTypeOne :
    return new FooOne();
    break;
  case FooTypeTwo :
    return new FooTwo();
    break;
  default:
    break;
  }
  return null;
}

void someFunction(FooType type) 
{
    std::vector<std::shared_ptr<Foo> > container;
    std::shared_ptr<Foo> f_ptr(MakeFoo(type));
    container.push_back(f_ptr);

    // Do something with the container.
    for(std::vector<std::shared_ptr<Foo> >::iterator iter = container.begin(); 
        iter != container.end(); iter++)
    {
       (*iter)->bar();  // call derived object's bar function respectively 
    }
}

C++03 を使用しているため、shared_ptr は次の場所にあります。std::tr1

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

class Foo {
public:
    virtual ~Foo() {}
    virtual void bar() = 0;
};

そうしないと、ベースへのポインターを介して派生型のオブジェクトを削除すると、未定義の動作が発生します。

于 2013-02-01T05:00:12.800 に答える
1

私が考えることができる唯一の簡単でクリーンなオプションは、テンプレートです。つまり、あなたが言うようにポインターを避けたい場合。

template <typename FooType>
void SomeFunction() {
    vector<FooType> container;

    // Do something with the container.
}


void SomeFunctionCaller(){
...
    if(type == "FooOne")
        SomeFunction<FooOne>();
    else
        SomeFunction<FooTwo>();

}

しかし、それはあなたのデザインとはかなり異なり、適合するかどうかはわかりません.

編集:ああ、スマートポインターで問題がなければ、それが道です。

于 2013-02-01T04:58:19.320 に答える