【发布时间】:2014-11-18 12:45:45
【问题描述】:
我有多个类共享一个公共基类,如下所示:
class Base {};
class DerivedA : public Base {};
class DerivedB : public Base {};
class DerivedC : public Base {};
现在,我需要知道在运行时要实例化这些派生类中的哪些(基于输入)。例如,如果输入是"DerivedA",我需要创建一个DerivedA 对象。输入不一定是字符串,也可以是整数 - 关键是有某种键,我需要一个值来匹配键。
但问题是,我如何实例化该类? C++ 没有像 C# 或 Java 那样的内置反射。我发现的一个普遍建议的解决方案是使用这样的工厂方法:
Base* create(const std::string& name) {
if(name == "DerivedA") return new DerivedA();
if(name == "DerivedB") return new DerivedB();
if(name == "DerivedC") return new DerivedC();
}
如果只有几个类,这就足够了,但如果有几十个或几百个派生类,这会变得很麻烦并且可能很慢。我可以很容易地自动化地图创建过程来生成std::map<std::string, ***>,但我不知道要存储什么作为值。 AFAIK,不允许指向构造函数的指针。同样,如果我使用此映射创建工厂,我仍然需要为每种类型编写工厂方法,这比上面的示例更加繁琐。
什么是处理这个问题的有效方法,尤其是当有很多派生类时?
【问题讨论】:
-
看起来像经典的factory pattern是你需要的。
-
@Ben 我不确定如何解决查找问题。归根结底,您必须将一些代码与字符串匹配。
-
如果您需要通过每次接收不同的枚举/任何内容来实例化不同的类,那么问题可能出在您的设计上。而且您有很多选择
标签: c++ instantiation