我正在尝试在加载时注册一堆类的工厂.我的策略是利用静态初始化来确保在main()开始之前,工厂已准备就绪.当我动态链接我的库时,这个策略似乎有效,但是当我静态链接时,这种策略似乎没有用.当我静态链接时,只有一些静态数据成员被初始化.
让我们说我的工厂建造汽车.我有CarCreator类可以实例化一些汽车,但不是全部.我希望工厂收集所有这些CarCreator类,以便寻找新车的代码可以去工厂而不必知道谁将进行实际构造.
所以我有
CarTypes.hpp
enum CarTypes
{
prius = 0,
miata,
hooptie,
n_car_types
};
Run Code Online (Sandbox Code Playgroud)
MyFactory.hpp
class CarCreator
{
public:
virtual Car * create_a_car( CarType ) = 0;
virtual std::list< CarTypes > list_cars_I_create() = 0;
};
class MyFactory // makes cars
{
public:
Car * create_car( CarType type );
void factory_register( CarCreator * )
static MyFactory * get_instance(); // singleton
private:
MyFactory();
std::vector< CarCreator * > car_creator_map;
};
Run Code Online (Sandbox Code Playgroud)
MyFactory.cpp
MyFactory:: MyFactory() : car_creator_map( n_car_types );
MyFactory * MyFactory::get_instance() {
static MyFactory …Run Code Online (Sandbox Code Playgroud) 我有一个与此类似的问题:
但他们使用的解决方法对我不起作用。
我有一个带有静态数据成员的 CRTP 类,其中一个是 std::mutex。不幸的是,GCC 的 (4.8.2) 链接器给了我这个互斥锁的“未定义引用”错误。Clang (3.4) 没有。有解决方法吗?最初的问题(上面链接)在静态数据成员上调用了复制构造函数,迫使 GCC 发出一个符号,但由于我的数据成员是 std::mutex,这不是一个选项——复制构造函数被删除,然后没有参数构造函数。我只是被冲洗了吗?
我不相信问题出在 std::mutex 上,我认为问题在于 GCC 如何处理依赖默认构造函数的模板类中的静态数据成员。
谢谢你的帮助!
这是我的问题的精简版:test.hh
#include <mutex>
template < class T >
class CRTP_class {
public:
T * ptr_;
static std::mutex mutex_; // linker error here
static int clearly_a_problem_with_mutex_; // no linker error here
};
class Foo : public CRTP_class< Foo >
{
public:
void set_bar( int setting );
int bar_;
};
Run Code Online (Sandbox Code Playgroud)
测试.cc
#include <test.hh>
template<> std::mutex CRTP_class< Foo >::mutex_;
template<> int CRTP_class< …Run Code Online (Sandbox Code Playgroud)