<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      閑人草堂

        博客園  :: 首頁  :: 新隨筆  :: 聯(lián)系 :: 訂閱 訂閱  :: 管理

      這是我這幾天倒騰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ī)器所役。

           與君共勉!

      posted on 2011-06-09 23:29  閑人草堂  閱讀(874)  評(píng)論(2)    收藏  舉報(bào)
      主站蜘蛛池模板: 免费无码一区无码东京热| 毛片网站在线观看| 强奷乱码欧妇女中文字幕熟女| 天堂网在线观看| 日韩精品人妻av一区二区三区| 成人午夜大片免费看爽爽爽| 久久中文字幕一区二区| 小嫩批日出水无码视频免费| 久久综合狠狠综合久久 | 扶沟县| 国产一级精品在线免费看| gogogo高清在线播放免费| 久久91精品牛牛| 77777五月色婷婷丁香视频| 激情五月天自拍偷拍视频| 成人午夜在线观看刺激| 国产成人无码A区在线观| 亚洲香蕉免费有线视频| 久久青草国产精品一区| 国产精品爽爽久久久久久竹菊| 亚洲最大成人免费av| 色综合视频一区二区三区| 国产精品美女自慰喷水| 兴安县| 武装少女在线观看高清完整版免费 | 蜜臀av一区二区三区日韩| 国产萌白酱喷水视频在线观看| 久热中文字幕在线精品观| 欧产日产国产精品精品| 国产精品13页| 在线观看视频一区二区三区| 91麻豆视频国产一区二区 | 1000部拍拍拍18勿入免费视频下载 | 欧美丰满妇大ass| 性色欲情网站iwww九文堂| 免费观看的av在线播放| 性色av无码久久一区二区三区| 日本熟妇浓毛| 亚洲无人区一区二区三区| 国产精品ⅴ无码大片在线看| 久久日韩精品一区二区五区|