最近弄個項目,突然有點偏愛全局變量了,于是乎罔顧教科書的教誨,大用特用,一下就遇到了兩個問題,茲記于此,以作教訓。
1、由于搞某種設備的讀寫,針對每種設備寫一個工廠類;然后聲明一個設備管理類的全局變量,在構造函數里把工廠類全注冊到設備管理類中。后來覺得這樣不好,每加一種設備都要改構造函數的代碼,于是我就寫了一個注冊類,在構造函數里進行注冊,然后在每個設備類的cpp里聲明注冊類的全局變量。
看起來很完美,于是我打了個lib,弄到另一個dll工程里編譯,結果就悲劇了,注冊類的構造函數死活不運行。最后發現,編譯器認為這個cpp的任何symbol都沒被引用,根本就不編譯進來,最后只好改回去。
2、而后我又在dll工程里聲明了一個全局變量,然后在全局變量的構造函數里,調用設備類的全局變量的成員獲取設備列表,結果發現取出來是空的。最后發現,設備類的構造函數在取設備列表時還沒有被調用,把初始化的代碼移到MFC的app.InitInstance里調用解決問題。
總結下:1、在c#、delphi里用得很順的工廠注冊類,在c++里是會被優化掉的,千萬用不得 2、任何情況下,不應在全局變量的構造函數里引用其他全局變量,這條應該不限于c++。