我有多个类都派生自基类,现在根据平台不会编译某些派生类。我有一个类允许我返回基类的对象,但是现在所有派生类的名称都是硬编码的。
有没有办法在运行时确定已编译的类,以便我可以删除链接,而是提供动态可加载的库。
答案 0 :(得分:3)
答案 1 :(得分:2)
我不知道你真正要完成什么,但你可以在每个派生类的实现文件中放置一个单例构造函数,将名称添加到列表中,同时指向工厂。然后列表始终是最新的,可以创建所有已编译的类。
答案 2 :(得分:1)
通常,依赖于运行时类型信息在C ++中是一个坏主意。你所描述的似乎是工厂模式。您可能需要考虑为每个平台创建一个特殊的工厂子类,它只能知道该平台上存在的类。
答案 3 :(得分:0)
答案 4 :(得分:0)
在运行时获取类信息时,有一些讨厌的,特定于编译器的技巧。相信我,你不想打开那种蠕虫。
在我看来,唯一认真的方法是对每个派生类使用条件编译。在#ifdef块中,定义一个 new 常量,该常量包含正在编译的类名。然后,名称仍然是硬编码的,但都位于中心位置。
答案 5 :(得分:0)
派生类的名称必须在C ++中进行硬编码。没有其他方法可以使用它们。因此,不仅无法自动检测已编译的类,如果存在,也无法使用该信息。
如果您可以根据名称在运行时指定类,例如:
std :: string foo =“Derived1”; Base * object = new“foo”; //或者你喜欢的任何符号 - 在C ++中不起作用
然后判断“Derived1”是否被编译的能力将是有用的。因为您必须直接指定类,例如:
Base * object = new Derived1; //可以在C ++中使用
所有检查都在编译时完成。
答案 6 :(得分:-1)
如果每个类都有自己的动态库,只需检查库是否存在。