我想创建一个类的对象,其名称为我已知的字符串,即动态。
假设我有一个班级A
和string str="ab"
所以我应该创建一个对象A ab;
但我不能指定“ab”,因为它应该像A str
,因为str
可能会动态变化。
答案 0 :(得分:4)
您可以使用地图数据结构,其中键是类的名称,值是用于创建对象的工厂类,或者是指向运行时将返回对象的函数的指针。但是,您可能需要将构造的对象强制转换为所需的类型。
示例(为我生锈的C ++代码道歉):
首先,我们有一个工厂类的接口
class IObjectFactory
{
public:
virtual ~IObjectFactory() {}
virtual void* Create() = 0;
};
然后,具体实现。我会直接做内联。
class ConcreteObjectFactory : public IObjectFactory
{
public:
void* Create() { return new ConcreteObject(); }
};
现在为地图。
using namespace std;
map<string, shared_ptr<IObjectFactory> > classMap;
// register the type
classMap["concreteObject"].reset( new ConcreteObjectFactory() );
// using it, albeit you take all kinds of risks if the string is not found
// or points to the wrong type.
ConcreteObject* o =
static_cast<ConcreteObject *>( classMap["concreteObject"]->Create() );
有很多方法可以改善这个答案。对于那些感兴趣的人,我建议在“C ++ for Games Programmers”
中查看关于RTTI的章节答案 1 :(得分:1)
变量的名称不是程序的一部分,或者更确切地说,名称在内存中不存在。 它只是一个“句柄”或“符号”,让程序员可以轻松访问变量, 即。找到变量内容在内存中的位置。
换句话说,在将一段代码编译成目标文件后,名称不再存在。
在你的情况下,“ab”实际上是内存中的内容,当“ab”出现在内存中时,你的程序已经在运行时运行,那时根本就没有变量名。
答案 2 :(得分:0)
我认为不可能..如果有人给你答案,你可以用这种方式解决问题:
class A {
public:
A(const std::string& name) : name_(name) {}
inline std::string name() { return name_; }
private:
std::string name_;
}
以这种方式你有一个从字符串到A的隐式转换,所以:
std::string className = "myName";
std::cout << (A)className->name(); /* print "myName" */
否则你可以使用地图数据结构作为建议Extrakun。
答案 3 :(得分:0)
在某些情况下,可以从名称转到已存在的该名称的变量(即现在不创建它)。这适用于UNIX上的dlsym
或Windows上的GetProcAddress
。该符号必须是可见的,因此从库中显式导出全局和Windows。谨防名称“捣乱”问题。
当然,除了代码生成的解决方法之外,假设存在编译器,将其构建到库中,就不可能以这种方式创建一个。
在您的情况下,您可能希望使用从字符串到变量的映射,如果您希望相同的映射能够存储不同的值类型,则可以使用boost::any
作为映射的值类型