如何实例化一个只知道其名称的对象

How can I instantiate an object knowing only its name?

本文关键字:对象 一个 实例化      更新时间:2023-10-16

可能重复:
有没有一种方法可以从包含对象类名的字符串中实例化对象?

在C++中,我想让我的用户输入要在运行时创建的对象类型名称,根据我从他们那里得到的字符串,程序将实例化正确的对象(简而言之,我正在实现工厂方法模式(。但是,如果程序必须支持新的对象类型,则不允许修改现有代码。

那么,是否可以从方法中删除所有if…else if…else-if…的内容,并且仍然让我的程序实例化特定产品类型的正确对象(在许多对象中,只有在编译时才知道(?

我四处搜索得到了这样一个链接:有没有一种方法可以从包含对象类名的字符串中实例化对象?这似乎是我想要的,但我根本看不懂代码。

如有任何帮助,我们将不胜感激。

只有当所有必需的类都是从某个公共基类派生的时,这才会起作用,并且您通常只能使用基本接口(尽管您可以通过一些额外的努力来解决这个问题(。这里有一种方法:

// Immutable core code:
#include <map>
#include <string>
class Base
{
  typedef Base * (*crfnptr)(const std::string &);
  typedef std::map<std::string, crfnptr> CreatorMap;
  static CreatorMap creators;
public:
  virtual ~Base() { }
  Base * clone() const { return new Base(*this); }
  static Base * create_from_string(std::string name)
  {
    CreatorMap::const_iterator it = creators.find(name);
    return it == creators.end() ? NULL : it->first();
  }
  static void register(std::string name, crfnptr f)
  {
    creators[name] = f;
  }
};

现在,您可以从新代码中添加新的派生类:

// your code:
#include "immutable_core.hpp"
class Foo : public Base
{
public:
  Foo * clone() const { return new Foo(*this); }
  static Foo * create() { return new Foo; }
};
Base::register("Foo", &Foo::create);

要创建一个类,只需调用Base * p = Base::create_from_string("Foo");

您可以实现类似插件系统的功能。我已经用dlopen在Linux中实现了这一点。该程序不需要修改,但只需要添加新的类作为将在运行时加载的动态库。

您可以从这里开始了解更多信息:C++dlopen mini HOWTO

相关文章: