例如,如果我有
string s = "myObject";
那么如何使用String来制作这个呢?
return new myObject();
我试过这个,但它很傻,这是错误的
return new s();
谢谢
答案 0 :(得分:8)
您可以创建一个简单的工厂并注册您希望能够构建的类。这是一种非常轻量级的反思。
#include <map>
#include <string>
template <class T> void* constructor() { return (void*)new T(); }
struct factory
{
typedef void*(*constructor_t)();
typedef std::map<std::string, constructor_t> map_type;
map_type m_classes;
template <class T>
void register_class(std::string const& n)
{ m_classes.insert(std::make_pair(n, &constructor<T>)); }
void* construct(std::string const& n)
{
map_type::iterator i = m_classes.find(n);
if (i == m_classes.end()) return 0; // or throw or whatever you want
return i->second();
}
};
factory g_factory;
#define REGISTER_CLASS(n) g_factory.register_class<n>(#n)
int main()
{
using namespace std;
REGISTER_CLASS(string);
std::string* s = (std::string*)g_factory.construct("string");
printf("s = '%s'\n", s->c_str());
*s = "foobar";
printf("s = '%s'\n", s->c_str());
return 0;
}
答案 1 :(得分:1)
您想要的是virtual constructor (pattern)。语言中此功能的可用性不一定与VM解释或管理的语言相关 - 它取决于程序(或库)中存在的有关类型的信息在运行时是如何(如果有的话) 。在“裸”C ++中并非如此 - 但它可以实现,例如Arvid所示。问题是这个功能没有标准化的实现,所以每个人都在不断地重新发明这个。在某种程度上COM或它的平台独立对应XPCOM在组件级别“标准化”。
答案 2 :(得分:0)
你不能通过设计在c ++中做到这一点。在c ++中,类型和对象之间有明显的区别,它们是语言的两个非常不同的实体。因此,您只能实例化一个类型并获取一个对象,并决定在编译时这样做(c ++不提供任何类型的反射系统,不像c#或java)。
但是,您可以将工厂/注册表用于要以此方式实例化的对象。
答案 3 :(得分:0)
你需要Reflection才能做到这一点。但是C ++ AFAIK不支持反射。
有趣的是QT C++支持某种反思。查看C# section它在那里的完成情况,Javascript有一个功能来执行此操作。它被称为eval()
答案 4 :(得分:-2)
使用C ++是不可能的,因为代码是自己运行的。只有解释型语言(如PHP)或通过解释程序运行的程序才允许使用此类功能。