2

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

有没有办法确定哪些类已经编译,最好是在运行时,这样我就可以删除链接,而是提供动态可加载的库。

4

7 回答 7

3

您在寻找 C++ 运行时类注册吗?我找到了这个链接备份)。

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

于 2008-09-16T22:26:00.130 回答
2

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

于 2008-09-16T22:16:55.923 回答
1

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

于 2008-09-16T22:17:10.370 回答
0

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

参见 Andrei Alexandrescu 的 Modern C++ Design 和他基于本书的Loki实现。另请参阅维基百科的Loki页面。

于 2008-09-16T22:16:15.160 回答
0

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

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

于 2008-09-16T22:16:22.960 回答
0

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

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

std::string foo = "Derived1"; 基础 * 对象 = 新的“foo”;// 或任何你喜欢的符号 - 在 C++ 中不起作用

那么判断“Derived1”是否已编译的能力将很有用。由于您必须直接指定类,例如:

基础 * 对象 = 新的 Derived1;// 在 C++ 中工作

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

于 2008-09-16T22:28:51.823 回答
-1

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

于 2008-09-16T22:15:01.327 回答