簡體   English   中英

在運行時動態設置矢量類

[英]Dynamically set vector class at runtime

請允許我提供一些背景。 我有一個抽象類,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時,在std::tr1下可以使用shared_ptr

注意:您需要向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>();

}

但這與您的設計有很大不同,不確定是否適合。

編輯:啊,如果您可以使用智能指針就可以了,那就是要走的路。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM