[英]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.