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