C ++运行时类的知识

时间:2008-09-16 22:13:08

标签: c++ class runtime

我有多个类都派生自基类,现在根据平台不会编译某些派生类。我有一个类允许我返回基类的对象,但是现在所有派生类的名称都是硬编码的。

有没有办法在运行时确定已编译的类,以便我可以删除链接,而是提供动态可加载的库。

7 个答案:

答案 0 :(得分:3)

您在寻找C ++运行时类注册吗?我找到了linkbackup)。

这可能会达到您想要的效果,我不确定动态加载的模块以及您是否可以使用相同的方法注册它们。

答案 1 :(得分:2)

我不知道你真正要完成什么,但你可以在每个派生类的实现文件中放置一个单例构造函数,将名称添加到列表中,同时指向工厂。然后列表始终是最新的,可以创建所有已编译的类。

答案 2 :(得分:1)

通常,依赖于运行时类型信息在C ++中是一个坏主意。你所描述的似乎是工厂模式。您可能需要考虑为每个平台创建一个特殊的工厂子类,它只能知道该平台上存在的类。

答案 3 :(得分:0)

这听起来像是使用“编译时多态”或模板策略参数的地方。

参见Andrei Alexandrescu的现代C ++设计及其基于本书的Loki实现。另请参阅维基百科上的Loki页面。

答案 4 :(得分:0)

在运行时获取类信息时,有一些讨厌的,特定于编译器的技巧。相信我,你不想打开那种蠕虫。

在我看来,唯一认真的方法是对每个派生类使用条件编译。在#ifdef块中,定义一个 new 常量,该常量包含正在编译的类名。然后,名称仍然是硬编码的,但都位于中心位置。

答案 5 :(得分:0)

派生类的名称必须在C ++中进行硬编码。没有其他方法可以使用它们。因此,不仅无法自动检测已编译的类,如果存在,也无法使用该信息。

如果您可以根据名称在运行时指定类,例如:

std :: string foo =“Derived1”; Base * object = new“foo”; //或者你喜欢的任何符号 - 在C ++中不起作用

然后判断“Derived1”是否被编译的能力将是有用的。因为您必须直接指定类,例如:

Base * object = new Derived1; //可以在C ++中使用

所有检查都在编译时完成。

答案 6 :(得分:-1)

如果每个类都有自己的动态库,只需检查库是否存在。