使用预定义字符串的名称创建类的对象

时间:2013-12-04 09:40:24

标签: c++

我想创建一个类的对象,其名称为我已知的字符串,即动态。

假设我有一个班级Astring str="ab" 所以我应该创建一个对象A ab; 但我不能指定“ab”,因为它应该像A str,因为str可能会动态变化。

4 个答案:

答案 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作为映射的值类型