![]() |
1
239
没有,没有,除非你自己做映射。C++没有机制来创建在运行时确定类型的对象。不过,您可以使用地图自己进行映射:
然后你就可以做了
获取一个新实例。另一个想法是让类型自己注册:
您可以决定为注册创建宏
不过我相信这两个人还有更好的名字。在这里使用另一个可能有意义的东西是
如果有一组没有公共基类的不相关类型,则可以为函数指针提供
A.
|
![]() |
2
6
不,没有。我对这个问题的首选解决方案是创建一个字典,将名称映射到创建方法。希望像这样创建的类然后向字典注册一个创建方法。本节将对此进行详细讨论 GoF patterns book . |
![]() |
3
5
|
![]() |
4
4
|
![]() |
5
2
functional有一个非常灵活的工厂模板: http://www.boost.org/doc/libs/1_54_0/libs/functional/factory/doc/html/index.html 不过,我的首选是生成隐藏映射和对象创建机制的包装器类。我遇到的常见场景是需要将某些基类的不同派生类映射到键,其中派生类都有一个可用的公共构造函数签名。这是我到目前为止提出的解决方案。
我通常反对大量使用宏,但我在这里破例。上面的代码为0和泛型工厂最大数量(含)之间的每个N生成名为GenericFactory\u N的类的泛型工厂最大数量+1个版本。 使用生成的类模板很容易。假设您希望工厂使用字符串映射创建基类派生对象。每个派生对象都采用3个整数作为构造函数参数。
GenericFactory\N类析构函数是虚拟的,允许执行以下操作。
请注意,这一行是通用factory generator宏的
|
![]() |
6
2
注册对象并使用字符串名称访问它们的详细解决方案。
编译并运行它(使用Eclipse完成此操作) 输出:
|
![]() |
7
1
Tor Brede Vekterli提供了一个增强扩展,它提供了您想要的功能。目前,使用当前的boostlibs有点不方便,但在更改了1.48_0的基本名称空间后,我能够让它使用1.48_0。 对于那些质疑为什么这样的事情(如反射)对C++有用的人来说,我用它来处理UI和引擎之间的交互——用户在UI中选择一个选项,引擎取UI选择字符串,并产生一个所需类型的对象。 在这里使用框架(而不是在某处维护水果列表)的主要好处是,注册函数位于每个类的定义中(每个注册类只需要一行代码调用注册函数),而不是包含水果列表的文件,每次派生新类时都必须手动将其添加到。 我使工厂成为基类的静态成员。 |
![]() |
8
0
在Java中表示反射。 http://msdn.microsoft.com/en-us/library/y0114hz2(VS.80).aspx 一般来说,在谷歌搜索“c++反射” |
![]() |
9
0
这是工厂模式。参见维基百科(和 this 示例)。如果没有一些惊人的技巧,就无法从字符串创建类型本身。你为什么需要这个? |
![]() |
Brendan · Java中从父类继承的对象的ArrayList 2 年前 |
![]() |
Tali · 继承-您应该使用基类,还是它们只是子类的框架? 2 年前 |
![]() |
mask2 · 如何轻松访问继承类的功能? 2 年前 |
![]() |
Dimon · 父类中的Setter,以及一些没有参数的子类 2 年前 |
![]() |
Miguerurso · Javascript类继承无法正常工作 2 年前 |
![]() |
GuessMe · 返回新类对象的正确方法(也可以扩展) 2 年前 |
![]() |
Daniel Lizik · 重写父类构造函数的子类成员初始值设定项 2 年前 |
![]() |
i_know_what · 以基类作为参数重写错误的方法 2 年前 |