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