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

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

概述我有一个工作类的集合,我需要能够使用单个工厂动态构造这些类的实例.这背后的原因是新的工人类经常被写入,而且每次添加新的工人类时,我不必更新每个工人类型的工厂类. 目前的工作方式如下:我有一个名为WorkerImplementationList的类,它带有一个静态方法: template <typename T> WorkerImplementationList::registerWorke 我有一个工作类的集合,我需要能够使用单个工厂动态构造这些类的实例.这背后的原因是新的工人类经常被写入,而且每次添加新的工人类时,我不必更新每个工人类型的工厂类.

目前的工作方式如下:我有一个名为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()开始之前,不构造全局范围的对象.

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

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

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

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

总结

以上是内存溢出为你收集整理的c – 确保在main()之前调用静态方法全部内容,希望文章能够帮你解决c – 确保在main()之前调用静态方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1213717.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存