关于类:C类的运行时知识

关于类:C类的运行时知识

C++ runtime knowledge of classes

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

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


您是否正在寻找C运行时类注册?我找到了此链接(备份)。

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


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


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


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

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

std :: string foo = " Derived1 ";
Base * object = new " foo "; //或您喜欢的任何符号-在C

中不起作用

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

Base * object = new Derived1; //可以在C

中工作

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


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

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


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

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


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


推荐阅读

    脚本linux上运行命令?

    脚本linux上运行命令?,工具,代码,时间,密码,系统,环境,名字,位置,第三,下来,t

    linux命令行运行中断?

    linux命令行运行中断?,连续,工作,系统,信息,程序,命令,设备,工具,网络,情况,L

    vim运行linux命令?

    vim运行linux命令?,系统,工作,信息,地址,命令,标准,时间,情况,工具,基础,linu

    linux下并行运行命令?

    linux下并行运行命令?,系统,服务,工作,命令,环境,网络,暂停,文件,脚本,参数,l

    jar运行命令linux?

    jar运行命令linux?,项目,系统,平台,工具,上期,命令,选项,日志,文件名,目录,Li

    jar运行命令linux?

    jar运行命令linux?,项目,系统,平台,工具,上期,命令,选项,日志,文件名,目录,Li

    linux下并行运行命令?

    linux下并行运行命令?,系统,服务,工作,命令,环境,网络,暂停,文件,脚本,参数,l

    linux命令行后台运行?

    linux命令行后台运行?,服务,状态,标准,暂停,命令,后台,连续,地方,工作,方法,l

    脚本运行linux命令?

    脚本运行linux命令?,系统,环境,工具,工作,位置,底部,代码,发行,官网,终端,lin

    linux进程运行命令?

    linux进程运行命令?,系统,工作,状态,地址,信息,进程,基础,命令,管理,软件,lin

    linux显示运行命令?

    linux显示运行命令?,系统,服务,状态,信息,工具,数据,电脑,标准,管理,时间,如

    linux运行vim命令?

    linux运行vim命令?,系统,工具,官方网站,模式,基础,数据,代码,环境,入口,命令

    linux监控命令运行?

    linux监控命令运行?,系统,工作,地址,信息,工具,情况,标准,环境,命令,状态,lin

    linux中命令停止运行?

    linux中命令停止运行?,系统,代码,第一,命令,进程,指令,程序,方法,接线,硬盘,l

    linux自动运行命令?

    linux自动运行命令?,服务,系统,时间,代码,周期性,第一,命令,管理,在线,状态,l

    linux开启运行命令?

    linux开启运行命令?,系统,服务,工作,管理,状态,命令,标准,情况,环境,工具,lin

    linux运行wps命令?

    linux运行wps命令?,软件,官网,名称,时间,电脑,系统,工具,环境,项目,数据,wps

    linux运行cmd命令?

    linux运行cmd命令?,电脑,系统,状态,情况,环境,命令,单位,管理,设备,数据,电脑

    linux运行两个命令?

    linux运行两个命令?,网络,地址,系统,工作,暂停,命令,网站,密码,网上,入口,Lin