gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:17:40 37 4
gpt4 key购买 nike

我有一组工作类,我需要能够使用单个工厂动态构造这些类的实例。这背后的原因是经常编写新的 worker 类,我不想每次添加新的 worker 类时都必须更新每个 worker 类型的工厂类。

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

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

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

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

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

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

静态链接我的工作程序库可以解决这个问题吗?我缺少更优雅的解决方案吗?如果您能给我任何帮助,我们将不胜感激。

最佳答案

这听起来像是链接器只拉入它需要的对象,而不是拉入具有全局变量的对象。那么全局根本不存在,因此初始化顺序是一个有争议的问题。

这是静态库的真正问题,没有通用的解决方案。

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

关于c++ - 确保在 main() 之前调用静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6221947/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com