【发布时间】:2011-06-03 00:53:44
【问题描述】:
我有一个工人类的集合,我需要能够用一个工厂动态地构造这些类的实例。这背后的原因是经常编写新的工人类,我宁愿每次添加新的工人类时都不必为每个工人类型更新工厂类。
目前的工作方式如下:我有一个名为WorkerImplementationList 的类,带有一个静态方法:
template <typename T>
WorkerImplementationList::registerWorkerFactoryMethod<T>(const std::string&)
将指向T::newInstance 的指针存储在内部数据结构中,稍后将由工厂检索。在每个工作类中都有一个名为 _dummyInstanceRegistrationVariable 的静态 int。在每个工人阶级的 .cc 文件中,我都有以下行(以FooWorker 为例):
int FooWorker::_dummyInstanceRegistrationVariable =
WorkerImplementationList::registerWorkerFactoryMethod<FooWorker>("FooWorker");
我希望在构造类的任何实例之前初始化静态变量。当工作类被编译成包含main() 的相同二进制文件时,这似乎工作得很好。但是,当FooWorker 在库中(比如libblahapp_workers.a)并且主可执行文件链接该库时,看起来_dummyInstanceRegistrationVariable 直到main() 启动后才被初始化(我假设它在第一个实例FooWorker 已构建),这对我的目的来说太迟了。
我还尝试在全局范围内构造一个WorkerImplementationRegisterer<T> 对象,该对象在构造时注册适当的工作类型,但是当工作类位于main() 外部的库中时,我又遇到了问题;在 main() 开始之前不会构造全局范围的对象。
静态链接我的工作库会解决这个问题吗?我是否缺少更优雅的解决方案?您能给我的任何帮助将不胜感激。
【问题讨论】:
-
听起来你已经触犯了“静态初始化顺序惨败”:parashift.com/c++-faq-lite/ctors.html#faq-10.14.
-
您确定您已正确诊断问题吗?全局范围的对象应该在 main() 开始之前构建,句号。
-
@Nemo 我已经尝试在 GDB 中打破对象的构造函数,并且断点永远不会被命中。我假设它与库中全局范围内的对象有关,但我不完全确定。
-
嗯。类似问题:stackoverflow.com/questions/5646211/… 这是什么编译器?如果是g++,你是用g++链接还是ld? (另见rachid.koucha.free.fr/tech_corner/shared_libs_tests.html)
-
g++ v4.4.5。我正在使用 g++ 链接。
标签: c++