• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Cpper
            C/C++高級(jí)工程師 Android高級(jí)軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語(yǔ)言 程序猿

            如何軟件設(shè)計(jì)中總有那么幾個(gè)比較小巧卻比較有用的小段代碼比如boost中的utility
            蓋莫游戲引擎也一樣有幾個(gè)比較小的代碼片段:
            如下這是關(guān)于指針的:

             1 //! 定義一個(gè)檢測(cè)指針是否為空的宏
             2 /*!
             3     當(dāng)指針為空的話則返回指定值
             4     例子如下:
             5     e.g:  Object* ptr = CreateObj();
             6           如果指針為空則返回-1
             7           CHECK_PTR(ptr,-1)   
             8           或者如果指針為空則返回;
             9           CHECK_PTR(ptr,;)           
            10 */
            11 #define CHECK_PTR(ptr,result)\
            12     if(NULL == ptr)\
            13         return result;
            14 
            15 //! 指針?shù)N毀        
            16 #define CHECK_PTR_AND_DELETE(ptr)\
            17     if(NULL!=ptr)\
            18     {\
            19         delete ptr;\
            20         ptr = NULL;\
            21     } 
            22 
            23 #define CHECK_PTR_ARRAY_AND_DELETE(ptr)\
            24     if(NULL!=ptr)\
            25     {\
            26         delete []ptr;\
            27         ptr = NULL;\
            28     }     
            這個(gè)比較好理解不說(shuō)什么。
            下面的這個(gè)是對(duì)象操作符重載相關(guān)的手法源于boost operator
            但是這個(gè)要比Boost中的好理解和容易使用一些
              1 ////////////////////////////////////////////////////////////
              2 /// 處理運(yùn)算符重載的宏
              3 /// 類似的例子為boost的operators為友元和基類
              4 /// 這里采用的是宏實(shí)現(xiàn)形式:) 
              5 /// 歡迎討論:) 
              6 ////////////////////////////////////////////////////////////
              7 
              8 ////////////////////////////////////////////////////////////
              9 /// 可減的
             10 ////////////////////////////////////////////////////////////
             11 #define SUBTRACTABLE(UDT,T)\
             12     UDT& operator-=(const T& t)\
             13     {\
             14         *this = *this - t;\
             15         return *this;\
             16     } 
             17    
             18 ////////////////////////////////////////////////////////////
             19 /// 可加的
             20 ////////////////////////////////////////////////////////////   
             21 #define ADDABLE(UDT,T)\
             22     UDT& operator+=(const T& t)\
             23     {\
             24         *this = *this + t;\
             25         return *this;\
             26     } 
             27 
             28 ////////////////////////////////////////////////////////////
             29 /// 可乘的
             30 ////////////////////////////////////////////////////////////      
             31 #define MULTIPLIABLE(UDT,T)\
             32     UDT& operator*=(const T& t)\
             33     {\
             34         *this = *this * t;\
             35         return *this;\
             36     } 
             37 
             38 ////////////////////////////////////////////////////////////
             39 /// 可除的
             40 //////////////////////////////////////////////////////////// 
             41 #define DIVISIBLE(UDT,T)\
             42     UDT& operator/=(const T& t)\
             43     {\
             44         *this = *this/t;\
             45         return *this;\
             46     } 
             47 
             48 ////////////////////////////////////////////////////////////
             49 /// 相等的
             50 //////////////////////////////////////////////////////////// 
             51 #define IS_EQUAL(T)\
             52     bool operator==(const T& t)\
             53     {\
             54         void *this_address = (void*)this;\
             55         const void* other_address = reinterpret_cast<const void*>(&t);\
             56         return memcmp(this_address,other_address,sizeof(T)) == 0;\
             57     }        
             58 
             59 ////////////////////////////////////////////////////////////
             60 /// 不相等的
             61 ////////////////////////////////////////////////////////////     
             62 #define NOT_EQUAL(T)\
             63     bool operator!=(const T& t)\
             64     {\
             65         return !(*this == t);\
             66     } 
             67 
             68 ////////////////////////////////////////////////////////////
             69 /// 使用相等和不相等
             70 ////////////////////////////////////////////////////////////     
             71 #define USE_EQUAL(T)\
             72     IS_EQUAL(T)\
             73     NOT_EQUAL(T)    
             74     
             75 ////////////////////////////////////////////////////////////
             76 /// 大于的
             77 //////////////////////////////////////////////////////////// 
             78 #define BIG_THAN(T)\
             79     bool operator>(const T& t)\
             80     {\
             81         return !((*this != t) || (*this < t));\
             82     } 
             83 
             84 ////////////////////////////////////////////////////////////
             85 /// 小于的
             86 //////////////////////////////////////////////////////////// 
             87 #define SMALL_THAN(T)\
             88     bool operator<(const T& t)\
             89     {\
             90         return !((*this != t) || (*this > t));\
             91     }
             92     
             93 ////////////////////////////////////////////////////////////
             94 /// 類賦值
             95 ////////////////////////////////////////////////////////////     
             96 #define COPY_CLASS(Object)\
             97     Object(const Object& obj)\
             98     {\
             99         *this = obj;\
            100     }\
            101     Object&  operator=(const Object& object)\
            102     {\
            103         void *this_address = (void*)this;\
            104         const void* other_address = reinterpret_cast<const void*>(&object);\
            105         memcpy(this_address,other_address,sizeof(object));\
            106         return *this;\
            107     }    
            108     
            109 #define COPY_OBJECT(T) COPY_CLASS(T)    
            接下來(lái)這個(gè)是個(gè)dummy類(中文應(yīng)該如何表達(dá)?)
            其用途就是作為占位符使用之
             1 ////////////////////////////////////////////////////////////
             2 /// 定義一個(gè)可選基類作為dummy使用之
             3 ////////////////////////////////////////////////////////////
             4 struct Base
             5 {
             6     virtual ~Base(){}; 
             7     
             8     //! 操作符重載
             9     inline bool operator==(const Base& base){return false;}
            10 };
            下來(lái)這個(gè)是指針的刪除
             1 ////////////////////////////////////////////////////////////
             2 /// 檢查性指針清空
             3 /// 手法源于Boost庫(kù)
             4 ////////////////////////////////////////////////////////////
             5 template<class T> 
             6 inline void CheckedDelete(T * x)
             7 {
             8     typedef char type_must_be_complete[ sizeof(T)? 1-1 ];
             9     (voidsizeof(type_must_be_complete);
            10     delete x;
            11 }

            采用了一點(diǎn)c++模板元編程的東東
            下面的也是

             1 ////////////////////////////////////////////////////////////
             2 /// 檢測(cè)給定對(duì)象是不是同一類型
             3 ////////////////////////////////////////////////////////////
             4 template<class L, class R>
             5 struct IsSameObject
             6 {
             7     enum{flag = false};
             8 };
             9 
            10 template<class T>
            11 struct IsSameObject<T,T>
            12 {
            13     enum{flag= true};
            14 };
            15 

             1 ////////////////////////////////////////////////////////////
             2 /// 提供基類一個(gè)參數(shù)
             3 ////////////////////////////////////////////////////////////
             4 template<class Base,class Arg>
             5 struct SingleArg : public Base 
             6 {
             7     SingleArg() : Base((Arg)0) {}
             8 }; 
             9 
            10 template<class Base>
            11 struct SingleArg<Base,void> : public Base
            12 {
            13     SingleArg() : Base() {}
            14 };

            下面的是不可復(fù)制類

             1 ////////////////////////////////////////////////////////////
             2 //!  定義一個(gè)實(shí)用的不可使用默認(rèn)構(gòu)造函數(shù)的基類
             3 ////////////////////////////////////////////////////////////
             4 class NonCopyable
             5 {
             6 protected:
             7     NonCopyable(){}
             8 private:
             9     NonCopyable(const NonCopyable&);
            10     NonCopyable& operator =(const NonCopyable&);
            11 };
            當(dāng)然也可以這樣寫:
            1 #define NonCopyable(T)\
            2     private:\
            3         T(const T& t);\
            4         T& operator=(const T&);

            當(dāng)然了其原理是一樣的呵呵
            這是單態(tài)的實(shí)現(xiàn):
             1 ////////////////////////////////////////////////////////////
             2 /// 單態(tài)模板類(非線程安全的)
             3 ////////////////////////////////////////////////////////////
             4 template <typename Base, typename T> 
             5 class Singleton  
             6 {
             7 public:
             8         
             9     //! 獲取對(duì)象指針  
            10     /*!
            11         這里暫時(shí)不需要線程安全的版本:) 
            12     */
            13     static T* Instance()
            14     {    
            15         if( NULL == instance ) 
            16             instance = new T;
            17         assert(instance = 0);
            18         return instance;
            19     }
            20 
            21     //! 對(duì)象指針的析構(gòu)  
            22     static void Deinit()
            23     {
            24         delete instance;
            25         instance = NULL;
            26     }
            27 
            28 private:  
            29     static Base* instance; 
            30 };
            31 
            32 //! 靜態(tài)成員初始化
            33 template <typename Base, typename T> 
            34 Base*  Singleton<Base, T>::instance = NULL;
            35 
            引擎異常類:
             1 ////////////////////////////////////////////////////////////
             2 /// 定義引擎異常類
             3 ////////////////////////////////////////////////////////////
             4 class Exception : public std::exception//!, NonCopyable 
             5 {
             6 public:
             7     Exception( const std::string&  msg) : why(msg) {}
             8     virtual ~Exception() throw() {}
             9 public:
            10     inline virtual const char* what()const throw() {return why.c_str();}
            11 private:
            12     std::string  why;
            13 };
            類型轉(zhuǎn)換
             1 ////////////////////////////////////////////////////////////
             2 /// 把指定數(shù)據(jù)類型轉(zhuǎn)換為字符串類型
             3 ////////////////////////////////////////////////////////////
             4 template<class T>
             5 std::string ToString(T value)
             6 {
             7     std::ostringstream  os;
             8     os << value;
             9     return os.str();
            10 }
            11  
            斷言版本:
            1 #define  THROW(r) throw core::Exception(r + std::string("filename: ") + std::string(__FILE__) + std::string("   line: ") + ToString(__LINE__))  
            2  
            3 #ifndef  ASSERT
            4 #define  ASSERT(b) if(!(b)) THROW(std::string("assertion <") + #b + std::string("> failed"))
            5 #endif
            cpu freq
             1 //! 獲取cpu頻率計(jì)數(shù)
             2 inline uint64 _GetCpuFreqCnt()
             3 {
             4 #ifdef _MSC_VER
             5     _asm _emit 0x0f 
             6     _asm _emit 0x31 
             7 #else 
             8     uint64 high32,low32;
             9     __asm("rdtsc":"=a"(low32),"=d"(high32));
            10 #endif     
            11 }
            泛型父類模板(在場(chǎng)景和UI系統(tǒng)中會(huì)大量使用)
             1 ////////////////////////////////////////////////////////////
             2 /// 定義泛對(duì)象父類
             3 ////////////////////////////////////////////////////////////
             4 //
             5 /// 使用例子如下
             6 ///      class  Object : public Parent<Object>
             7 //    .
             8 //
             9 template<class Object>
            10 class Parent
            11 {
            12 public
            13     
            14     inline Parent(Object parent = NULL){object = parent;}
            15     virtual ~Parent(){}
            16     inline void   SetParent(Object parent){object = parent; }
            17     inline Object GetParent()const{return object;}    
            18     inline bool   HasParent()const{return (NULL != object);}
            19     Object GetTopParent()const
            20     {
            21         Object ret = object
            22         Object obj = ret;
            23         while(obj != NULL)
            24         {
            25             ret = obj;
            26             obj = ret->GetParent();
            27         }
            28         return ret;    
            29     }    
            30     
            31 private:
            32     Object  object
            33 }; 

            最后來(lái)一個(gè)類型持有者(這里少一個(gè)構(gòu)造函數(shù)):
             1 ////////////////////////////////////////////////////////////
             2 /// 定義一個(gè)獲取設(shè)置對(duì)象類型的類
             3 ////////////////////////////////////////////////////////////
             4 template<class T>
             5 class TypeHolder
             6 {
             7 public:
             8     inline void SetType(const T &t){type = t;}
             9     inline T    GetType()const{return type;}
            10 private:
            11     T      type;
            12 }; 
            13  
            posted on 2010-02-10 15:17 ccsdu2009 閱讀(1504) 評(píng)論(3)  編輯 收藏 引用
            Comments
            • # re: 蓋莫游戲引擎中的便利宏和及幾個(gè)小類
              ccsdu2009
              Posted @ 2010-02-10 15:18
              引擎只在底層使用boost并沒(méi)有在頭文件中使用之
              一個(gè)重要的原因就是為了提高代碼的可讀性
              引擎是給別人使用的
              保持良好的可讀性是十分重要的  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎中的便利宏和及幾個(gè)小類
              陳梓瀚(vczh)
              Posted @ 2010-02-13 17:08
              1,COPY_CLASS定義的東西都是自動(dòng)生成的,你不用專門去寫。
              2,我覺(jué)得單態(tài)的那個(gè)對(duì)象的類型如果不能被重復(fù)創(chuàng)建,那你就定義成函數(shù)。不能重復(fù)創(chuàng)建的類型沒(méi)有定義的必要,這組東西如果太多就寫在namespace里面。
              3,ToString太重,你用StrToInt也可以。
              4,GetCpuFreqCnt如果在64位下不行的話,最好#ifdef一下。
              5,Parent應(yīng)該是一棵樹(shù)吧,最好重命名。
              6,TypeHolder那樣定義僅會(huì)讓你的代碼變長(zhǎng),最好用一個(gè)類把所有的設(shè)置都裝在一起,或者把他們定義成全局變量。全局變量跟單態(tài)是一樣的,不要因?yàn)閾Q一種方法就覺(jué)得自己避免了全局變量一樣。  回復(fù)  更多評(píng)論   
            • # re: 蓋莫游戲引擎中的便利宏和及幾個(gè)小類
              ccsdu2009
              Posted @ 2010-02-22 14:56
              @陳梓瀚(vczh)
              StrToInt? 有這個(gè)函數(shù)?  回復(fù)  更多評(píng)論   

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


             
            久久99国产精品久久久 | 久久婷婷五月综合色99啪ak| 久久最新精品国产| 亚洲国产精品狼友中文久久久| 久久久久久国产精品美女| 日韩精品久久久肉伦网站| 久久这里只有精品久久| 精品久久久久久无码不卡| 国产精品美女久久久久| 亚洲精品午夜国产va久久| 久久电影网一区| 伊人久久大香线蕉AV色婷婷色| 99久久久精品| 亚洲AV无码久久精品蜜桃| 久久99精品久久久久久不卡 | 女人香蕉久久**毛片精品| 中文成人久久久久影院免费观看| 国产精品无码久久久久久| 国产精品中文久久久久久久| 青青热久久综合网伊人| 欧美亚洲色综久久精品国产| 香蕉aa三级久久毛片| 久久久久亚洲av成人无码电影| 成人妇女免费播放久久久| 久久久久久久91精品免费观看| 精品国产乱码久久久久软件| 久久久噜噜噜久久中文字幕色伊伊| 国产午夜精品久久久久免费视 | 色综合久久久久无码专区| 香蕉99久久国产综合精品宅男自 | 狠狠色丁香久久综合婷婷| 三级三级久久三级久久| 亚洲国产成人精品久久久国产成人一区二区三区综 | 国产午夜久久影院| 久久亚洲国产成人精品性色| 久久精品国产AV一区二区三区| 色婷婷狠狠久久综合五月| 日本久久中文字幕| 三级三级久久三级久久| 性做久久久久久久| 国产精品久久成人影院|