加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 确保在main()之前调用静态方法

发布时间:2020-12-16 09:35:08 所属栏目:百科 来源:网络整理
导读:我有一个工作类的集合,我需要能够使用单个工厂动态构造这些类的实例.这背后的原因是新的工人类经常被写入,而且每次添加新的工人类时,我不必更新每个工人类型的工厂类. 目前的工作方式如下:我有一个名为WorkerImplementationList的类,它带有一个静态方法: t
我有一个工作类的集合,我需要能够使用单个工厂动态构造这些类的实例.这背后的原因是新的工人类经常被写入,而且每次添加新的工人类时,我不必更新每个工人类型的工厂类.

目前的工作方式如下:我有一个名为WorkerImplementationList的类,它带有一个静态方法:

template <typename T>
    WorkerImplementationList::registerWorkerFactoryMethod<T>(const std::string&)

在内部数据结构中存储指向T :: newInstance的指针,稍后将由工厂检索.在每个worker类中都有一个名为_dummyInstanceRegistrationVariable的静态int.在每个工作类的.cc文件中,我有以下行(以FooWorker为例):

int FooWorker::_dummyInstanceRegistrationVariable =
    WorkerImplementationList::registerWorkerFactoryMethod<FooWorker>("FooWorker");

我想要发生的是在构造类的任何实例之前初始化静态变量.当worker类被编译成包含main()的相同二进制文件时,这似乎工作得很好.但是,当FooWorker在库(比如libblahapp_workers.a)中并且主可执行文件链接该库时,看起来_dummyInstanceRegistrationVariable在main()启动之后才会初始化(我假设在构造FooWorker的第一个实例时它已初始化),这对我的目的来说太晚了.

我也尝试构建一个WorkerImplementationRegisterer< T>全局范围内的对象,它在构造时注册适当的工作类型,但是当工作类位于main()外部的库中时,我再次遇到问题;在main()开始之前,不构造全局范围的对象.

静态链接我的工作者库会解决这个问题吗?我缺少一个更优雅的解决方案吗?你能给我的任何帮助都将不胜感激.

解决方法

这听起来像链接器只引入它需要的对象,而不是拉入具有全局变量的对象.那么全局根本不存在,所以初始化顺序是一个没有实际意义的点.

静态库是一个真正的问题,没有通用的解决方案.

知道链接器立即从库中获取整个编译单元(在我看过的所有系统上),您可能想出一些方法将这个全局变量放入需要的编译单元中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读