非常规代码,有的时候,连接的时候,编译器认为没有使用A.cpp,结果导致编译了A.cpp也没有A模块,需要添加特殊的连接指令。只是好玩,慎用。
实现思路。定义一个全局的管理Factory的类Factorys,在A.cpp里面定义一个全局变量,全局变量构造的时候,把 A 的 工厂类 FactoryA 插入到Factorys中。这样只要编译连接了A.cpp,就会在构造的时候把A模块插入到Factorys中了。
原理很简单,实现又遇到一个问题:构造的顺序的问题,假如Factorys也是全局变量。此时FactoryA和Factorys的构造顺序不是固定的,可能先构造了FactoryA,而此时Factorys还没有初始化,导致出错。
为此。我研究了c++的整个构造过程,发现,构造是单线程,此时main函数都没有开始执行。
如果是int 这样的基本类型,分配内存的时候,就已经初始化完了,在所有全局变量中,是最早初始化的。第二个全局类变量初始化,此时会调用构造函数。第三个,函数内static定义的变量。只在函数第一次进入的时候初始化。
如果构造时,调用函数内static定义的变量,如下:
//Factorys.cpp
Factorys * Factorys::getInstance(){
static Factorys fac;
return &fac;
}
//A.cpp
FactoryA::FactoryA(){
Factorys::getInstance()->insert(this);
}
static FactoryA gFacA;
这样就能保证Factorys永远在FactoryA构造之前构造。



