C ++类的运行时知识

时间:2020-03-05 18:57:21  来源:igfitidea点击:

我有多个类都是从基类派生的,现在某些派生类将不会根据平台进行编译。我有一个可以让我返回基类对象的类,但是现在派生类的所有名称都经过了硬编码。

有一种方法可以确定哪些类最好在运行时进行编译,以便我可以删除链接并改为提供可动态加载的库。

解决方案

回答

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

回答

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

请参阅Andrei Alexandrescu撰写的Modern C ++ Design及其基于本书的Loki实现。另请参阅Wikipedia上的Loki页面。

回答

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

在我看来,做到这一点的唯一严肃的方法是在每个派生类上使用条件编译。在#ifdef块中,定义一个新常量,其中包含要编译的类名称。然后,名称仍然是硬编码的,但都在中央位置。

回答

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

回答

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

回答

我们是否正在寻找C ++运行时类注册?我发现此链接:
http://meat.net/2006/03/cpp-runtime-class-registration/

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

回答

派生类的名称必须使用C ++进行硬编码。没有其他方法可以使用它们。因此,不仅没有办法自动检测已经编译了哪些类,而且还没有办法使用该信息(如果存在)。

如果可以在运行时根据类的名称指定类,则类似于:

std :: string foo =" Derived1";
Base * object = new" foo"; //或者我们喜欢的任何符号在C ++中均不起作用

那么判断" Derived1"是否已编译的功能将很有用。由于我们必须直接指定类,例如:

基础*对象=新的Derived1; //在C ++中有效

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