您要創建的類型是否有共同的基礎? 和C++一樣,你不能擁有不相關類型的集合(vector/map),類型應該有一個通用的基類,以使下面的代碼可以工作。 (否則,您可以用void *,但轉化率不會是安全的):
#include <iostream>
#include <map>
class Entity {
public:
virtual ~Entity(){}
};
class C1: public Entity
{
public:
void doSomething(){std::cout << "C1" << std::endl;}
};
class C2: public Entity
{
public:
void doSomething(){std::cout << "C2" << std::endl;}
};
class C3
{
public:
void doSomething(){std::cout << "C3" << std::endl;}
};
class CreatorBase {
public:
virtual ~CreatorBase() {};
virtual Entity* create() = 0;
};
template<typename T>
class Creator: public CreatorBase {
public:
Entity* create()
{
return new T;
}
};
std::map<int, CreatorBase*> cmap;
在這裏,我們有一個基類的實體和C1和C2從它繼承。 接下來,有模板類Creator,它創建所請求類型的對象。
它們都從CreatorBase繼承,以便它們可以存儲在地圖中。
創建者返回實體*併爲了類型安全性,我們可以在調用create()時使用動態轉換,以確保我們創建正確的類型。
如果您只需要一個實體指針,則可以在任何地方使用實體*,並且不需要動態強制轉換。
int main(int argc, char *argv[])
{
cmap[1]=new Creator<C1>;
cmap[2]=new Creator<C2>;
//cmap[3]=new Creator<C3>; //will not compile - C3 does not derive from Entity
C1 *i1 = dynamic_cast<C1*> (cmap[1]->create());
C2 *i2 = dynamic_cast<C2*> (cmap[2]->create());
C1 *i3 = dynamic_cast<C1*> (cmap[2]->create()); //bad dynamic cast: cmap[2] does not create C1
if (!i1) {
std::cout << "i1: Bad dynamic cast" << std::endl;
} else {
i1->doSomething();
}
if (!i2) {
std::cout << "i2: Bad dynamic cast" << std::endl;
} else {
i2->doSomething();
}
if (!i3) {
std::cout << "i3: Bad dynamic cast" << std::endl;
} else {
i3->doSomething();
}
}
輸出:
C1
C2
i3: Bad dynamic cast
什麼是 「newExtensions」? –
我不太明白,'this-> newExtensions'的類型是什麼? –
對不起,這是一張地圖。 – solusipse