這是我這幾天倒騰wii的一點(diǎn)心得,貼出來曬曬,不足之處請(qǐng)大家批評(píng)指教啊。
需求:有一個(gè)類Base,Base::fun()在不同平臺(tái)下的實(shí)現(xiàn)不同(可能依托于第三方庫(kù)),問題是,如何才能讓我在調(diào)用Base的時(shí)候,不用區(qū)分平臺(tái),即達(dá)到一次coding,處處可編譯通過?
1 class Base
2 {
3 public:
4 void fun();
5 };
解法1:
最簡(jiǎn)單的方法,就用這套接口在不同平臺(tái)上寫好實(shí)現(xiàn),編譯成靜態(tài)庫(kù)或者動(dòng)態(tài)庫(kù),然后一個(gè)頭文件,一個(gè)lib走遍天下。
解法2:
稍微折騰一點(diǎn),使用抽象類:
1 class Base
2 {
3 public:
4 virtual void fun();
5 };
6
7 class windows_v : public Base
8 {
9 public:
10 virtual void fun();
11 };
12
13 class linux_v : public Base
14 {
15 public:
16 virtual void func();
17 };
那在程序中如何使用呢,直接 Base *b = new windows_v,或者Base *b = new linux_v, 還是沒達(dá)到一次coding,處處編譯的目的。咋辦,這里有個(gè)有效但是丑陋的方法,相信你也想到了,宏替換!譬如:
1 #if defined(_WIN32) || defined(_WIN64)
2 #define platform windows_v
3 #else
4 #define platform linux_v
5 #endif
然后 Base *b = new platform 解決。
解法3:
解法2其實(shí)算不得跨平臺(tái),寫出來純粹是湊數(shù)。解法3要展示的還是跟抽象類有關(guān)。
1 class Base
2 {
3 public:
4 virtual void fun() = 0;
5 static Base* create();
6 void Destroy(){delete this;}
7 };
8
9 class windows_v : public Base
10 {
11 public:
12 virtual void fun();
13 };
14
15 class linux_v : public Base
16 {
17 public:
18 virtual void func();
19 };
20
21 Base* Base::create()
22 {
23 #if defined(_WIN32) || defined(_WIN64)
24 return new windows_v;
25 #else
26 return new linux_v;
27 #endif
28 }
29
30 int main()
31 {
32 Base *b = Base::create();
33 .....
34 b->Destroy();
35 return 0;
36 }
Base 是個(gè)純抽象類,只定義接口,不能實(shí)例化。所以定義了create()函數(shù)類動(dòng)態(tài)創(chuàng)建實(shí)現(xiàn)類的對(duì)象。入口函數(shù)可以是全局函數(shù),但最好是靜態(tài)成員函數(shù)。
解法4:
解法3已經(jīng)較好的實(shí)現(xiàn)了跨平臺(tái),但是由于使用了虛類,肯定會(huì)對(duì)性能帶來一些影響。那么可以換種別的方式,即不使用繼承。如果覺得void* 太危險(xiǎn)可以使用boost::any,這個(gè)其實(shí)是用模板實(shí)現(xiàn)的動(dòng)態(tài)綁定,對(duì)性能影響不大。這種方法還能進(jìn)一步擴(kuò)展,可以接受字符串來決定用哪個(gè)版本的實(shí)現(xiàn)類來賦給imp。
1 class Base
2 {
3 public:
4 Base();
5 protected:
6 void * imp; // boost::any imp;
7 };
8
9 class imp_windows_v
10 {};
11
12 Base::Base():imp(new imp_windows_v)
13 {}
總結(jié):
這幾種都是我這幾天查找資料總結(jié)出來的,如果還有其他一些更智能更簡(jiǎn)潔的方法,請(qǐng)給我發(fā)郵件jtf198711@gmail.com。
經(jīng)此一役,我深切體會(huì)到,程序員必須是會(huì)偷懶的人。只有時(shí)刻想著以更高的效率,更短的時(shí)間完成工作的人,才不被機(jī)器所役。
與君共勉!
浙公網(wǎng)安備 33010602011771號(hào)