0

请允许我介绍一些背景。我有一个抽象类,Foo。

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

我有两个从这个类继承的类。

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

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

现在在一个完全不同的类中,我想在一个函数中创建一个数组,该数组可以保存这两个类之一的实例。我遇到的问题是我不能创建一个像这样的动态类型的数组,可以吗?我已经习惯了 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 回答