最近弄个项目,突然有点偏爱全局变量了,于是乎罔顾教科书的教诲,大用特用,一下就遇到了两个问题,兹记于此,以作教训。
1、由于搞某种设备的读写,针对每种设备写一个工厂类;然后声明一个设备管理类的全局变量,在构造函数里把工厂类全注册到设备管理类中。后来觉得这样不好,每加一种设备都要改构造函数的代码,于是我就写了一个注册类,在构造函数里进行注册,然后在每个设备类的cpp里声明注册类的全局变量。
看起来很完美,于是我打了个lib,弄到另一个dll工程里编译,结果就悲剧了,注册类的构造函数死活不运行。最后发现,编译器认为这个cpp的任何symbol都没被引用,根本就不编译进来,最后只好改回去。
2、而后我又在dll工程里声明了一个全局变量,然后在全局变量的构造函数里,调用设备类的全局变量的成员获取设备列表,结果发现取出来是空的。最后发现,设备类的构造函数在取设备列表时还没有被调用,把初始化的代码移到MFC的app.InitInstance里调用解决问题。
总结下:1、在c#、delphi里用得很顺的工厂注册类,在c++里是会被优化掉的,千万用不得 2、任何情况下,不应在全局变量的构造函数里引用其他全局变量,这条应该不限于c++。