在运行时动态设置向量类

Dynamically set vector class at runtime

本文关键字:向量 设置 动态 运行时      更新时间:2023-10-16

请允许我介绍一些背景。我有一个抽象课,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。

您可以在 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;
};

否则,如果通过指向基的指针删除派生类型的对象,则会得到未定义的行为。

我能想到的唯一简单干净的选择是模板。 即如果你想避免你所说的指针。

template <typename FooType>
void SomeFunction() {
    vector<FooType> container;
    // Do something with the container.
}

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

但它与您的设计完全不同,不确定它是否合适。

编辑:啊,如果你对智能指针没问题,那么这就是要走的路。