【发布时间】:2016-06-10 11:16:48
【问题描述】:
通常,如果您事先知道要创建的所有类型,则可以执行以下操作:
typedef enum{
BASE_CREATURE_TYPE = 0,
ANIMAL_CREATURE_TYPE,
...
}CREATURE_TYPES
但这变得乏味,因为每次创建新类时,都需要更新枚举。此外,CREATURE_TYPES 仍然只是枚举中的项目 - 如何绑定到实际类?
我想知道是否有某种方法,我可以只编写类,然后在运行时,无需实际实例化对象,创建一个包含所有类型的集合。
这在 C++ 中可行吗?在 Java 中,有一种叫做“静态块”的东西,它在类被 JVM 加载时执行。
编辑:这个问题与静态块无关 - 这只是一个示例 - 我想知道是否有某种方法可以执行方法或代码块,以便我知道运行时存在哪些类,而无需实际创建一个对象
编辑:我的意思是所有类型的集合,而不是“地图”,因此我可以创建每种类型的对象,而无需维护列表。
编辑:我想要这个的原因是因为我正在尝试创建一个函数,该函数可以调用作为应用程序一部分的所有派生类的方法。例如,假设我有几个类都派生自类 Foo,并且有一个 balls():
Foo{
balls();
}
Boo : public Foo{
balls();
}
Coo: public Foo{
balls():
}
在运行时,我想知道所有派生类,以便调用:
DerivedClass:balls();
编辑:请注意,我不需要知道每个派生类的所有成员,我只想知道所有派生类是什么,所以我可以在每个派生类上调用 balls()。
编辑:这个问题类似:How to automatically register a class on creation
但不幸的是,他正在存储一个 std::string()。如何引用实际的类?
编辑:在下面 Smeehey 的回答中,在 main 方法中,我将如何实际创建每个类的实例,并同时调用静态和非静态方法?
【问题讨论】:
-
“创建地图”?什么样的地图?卢克天行者的地图?
-
你能解释一下你为什么想要这个吗?这样回答可能会更容易。
-
@ShayNehmad 我想要它,以便我可以动态填充一个菜单,该菜单用于创建各种派生类型。但是将一个按钮绑定到每个派生类型会非常乏味,所以我试图确定是否有任何方法可以“反映”作为应用程序一部分的所有派生类,以便我可以动态调用所有方法,而无需了解每种类型。
-
我认为可以使用预处理器命令甚至专用脚本。或外部 DLL,如插件子系统。我应该详细说明还是这不是您要找的?
-
@ShayNehmad - 我想避免编写构建脚本,因为这违背了我想要做的事情的目的。你能解释一下我如何使用预处理器命令来做到这一点吗?
标签: c++