• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    在C++中利用模板實現 data variant(propery)

    發布: 2008-6-04 13:54 | 作者: 不詳 | 來源: CSDN | 查看: 108次 | 進入軟件測試論壇討論

    領測軟件測試網 關鍵字:C++ 模板 data variant propery

    介紹在C++中利用模板來實現對象Property的方法。這個方法在Linux下用g++編譯調試通過。但未在正式的工程中使用過。還請大家多提意見。
           在C++Builder, 可以通過CB的擴展語法__property()來實現對象的Property。但這個方法必需有編譯器的支持,脫離了CB的編譯環境就無法使用。同樣的,在VC6.0以上的版本中,也實現了__declspec(property)這樣一個語法來實現property.它除了跟CB 中的perperty一樣,在跨平臺方面有局限性以外,而且他不支持多態。 下面的例子可以說明: class M
       {
     private:
      int v;
      virtual int Get()
      {
       return v;
      }
      virtual void Set(int x)
      {
       v = x;
      }
     public:
       __declspec(property(get=Get,put=Set)) int XValue;
       };   class MM : public M
       {
     virtual int Get()
            {
      return v+3;
     }
     virtual void Set(int x)
     {
      v = x -3;
     }
       };   MM m;
       m.XValue = 3; //實際上調用的是M::Set(),而不是MM::Set()
       int v = m.XValue; //實際上調用的是M::Get(), 而不是MM:Get();
       為什么呢?因為在編譯器進行編譯的時候,已經將這個property跟 M::Get(),M::Set()邦定在了一起。      鑒于上面所述,我們提出我們目標:      1. 要實現Property,并且不依賴于某一個開發平臺,只要是當前流行的C++編譯器都可以編譯通過。      2. 必須使這種Property的實現方法符合OOP的法則。      只有達到以上兩點,才能使我們的方法有實用性。      下面我們利用C++的模板方法來實現Property. 這個方法未必是最好的,而且在實際使用的時候還會是有問題的。但也算是學習一下C++的Template了。      首先來看看Property的基本實現原理。在C++語法中,是沒有Property這樣的語法的。在C++中,Property就相當于類成員變量,我們可以把成員變量暴露在Public域,這樣我們可以任意操作他,而不用很麻煩的去調用某一個操作函數(看上去就象在VB中操作對象的Property一樣)。但實際上這是一種很不安全的方法,因為我們失去了對這個成員變量的控制,那將會發生很多意料不到的事情。 因此在C++中,Property的實現都是通過成員函數來模擬實現的。比如:      class A    {        private:              int x;         public:              void get_X(int& v);              void put_X(int v);            }      類A中的成員函數X,就是通過get_X()和put_X()這兩個函數來實現訪問的。這將保證變量x盡量的處于我們的保護之中(可以在get_X,put_X中寫入我們對x的保護代碼)。
         那么能否通過某一種方法,來隱藏對get_和put_函數的調用,而類似于:     A.X_Value = 3; //其實是間接調用A.put_X(3)     int a = A.X_Value; //其實是間接調用A.get_X();這樣的語法呢?     可以通過C++的模板技術來實現。要實現這樣的語法,我們需要一個代理模板類, 在這個模板類中,我們重載操作符"=", 在這個重載的operator =()函數中,我們調用宿主對象的put_X()函數,把值傳入. 然后我們還要重載屬性值類型的操作符, 比如屬性值的類型是 string ,則我們要重載一個叫string的操作符, 并在 operator string()中調用宿主對象的get_X()函數,把值傳出去.

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: 模板 data propery variant

    31/3123>

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>