基本上我将类名存储在char *
中,如何创建该类的实例。
以下是我的想法。当我将Test
作为模板参数传递时很有效,但是如果我尝试这样的Test *t = CreateType<ptr>
,它将不起作用。
有没有办法让这项工作。
class Test{
public:
Test() {
}
~Test() {
}
};
template <typename T>
T* CreateType() {
return new T;
}
int main ( int argc, char **argv) {
char *ptr = "Test";
Test *T = CreateType<Test>();
return 0;
}
答案 0 :(得分:5)
在C ++中不可能直接,因为语言不是内省的。
你可以尝试做类似的东西。例如,您可以使用map< string, baseClassPointer >
,其中键将是类的名称,值将是指向该类对象的指针。然后,您可以通过从地图复制对象来创建其他对象(可以通过类型名称获取)。我不建议做那样的事情。
工厂模式可能适合您的需求。
答案 1 :(得分:4)
这在C ++中是不可能的,因为在C ++中没有像反射这样的机制。你能做的就是编写一个知道如何从字符串构造对象的工厂。
class Base
{
public:
virtual ~Base(){}
};
class Factory
{
public:
typedef std::function<Base*()> Creator;
void Register(const std::string& key, Creator creator)
{
creators_[key] = creator;
}
std::unique_ptr<Base> Create(const std::string& key)
{
auto creator = creators_[key];
auto instance = std::unique_ptr<Base>(creator());
return instance;
}
private:
std::unordered_map<std::string, Creator> creators_;
};
class Concrete : public Base
{
};
int main()
{
Factory factory;
factory.Register("Concrete", [](){ return new Concrete;});
auto instance = factory.Create("Concrete");
}