青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Cpper
C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿

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

 1 //! 定義一個檢測指針是否為空的宏
 2 /*!
 3     當指針為空的話則返回指定值
 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 //! 指針銷毀        
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     }     
這個比較好理解不說什么。
下面的這個是對象操作符重載相關(guān)的手法源于boost operator
但是這個要比Boost中的好理解和容易使用一些
  1 ////////////////////////////////////////////////////////////
  2 /// 處理運算符重載的宏
  3 /// 類似的例子為boost的operators為友元和基類
  4 /// 這里采用的是宏實現(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)    
接下來這個是個dummy類(中文應(yīng)該如何表達?)
其用途就是作為占位符使用之
 1 ////////////////////////////////////////////////////////////
 2 /// 定義一個可選基類作為dummy使用之
 3 ////////////////////////////////////////////////////////////
 4 struct Base
 5 {
 6     virtual ~Base(){}; 
 7     
 8     //! 操作符重載
 9     inline bool operator==(const Base& base){return false;}
10 };
下來這個是指針的刪除
 1 ////////////////////////////////////////////////////////////
 2 /// 檢查性指針清空
 3 /// 手法源于Boost庫
 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 }

采用了一點c++模板元編程的東東
下面的也是

 1 ////////////////////////////////////////////////////////////
 2 /// 檢測給定對象是不是同一類型
 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 /// 提供基類一個參數(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òu)造函數(shù)的基類
 3 ////////////////////////////////////////////////////////////
 4 class NonCopyable
 5 {
 6 protected:
 7     NonCopyable(){}
 8 private:
 9     NonCopyable(const NonCopyable&);
10     NonCopyable& operator =(const NonCopyable&);
11 };
當然也可以這樣寫:
1 #define NonCopyable(T)\
2     private:\
3         T(const T& t);\
4         T& operator=(const T&);

當然了其原理是一樣的呵呵
這是單態(tài)的實現(xiàn):
 1 ////////////////////////////////////////////////////////////
 2 /// 單態(tài)模板類(非線程安全的)
 3 ////////////////////////////////////////////////////////////
 4 template <typename Base, typename T> 
 5 class Singleton  
 6 {
 7 public:
 8         
 9     //! 獲取對象指針  
10     /*!
11         這里暫時不需要線程安全的版本:) 
12     */
13     static T* Instance()
14     {    
15         if( NULL == instance ) 
16             instance = new T;
17         assert(instance = 0);
18         return instance;
19     }
20 
21     //! 對象指針的析構(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頻率計數(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 }
泛型父類模板(在場景和UI系統(tǒng)中會大量使用)
 1 ////////////////////////////////////////////////////////////
 2 /// 定義泛對象父類
 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 }; 

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

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


 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲看片一区| 国产一区二区三区久久久久久久久| 最新热久久免费视频| 久久青草福利网站| 另类专区欧美制服同性| 欧美肥婆在线| 亚洲每日在线| 午夜久久美女| 蜜桃av久久久亚洲精品| 欧美日本不卡| 国产乱码精品一区二区三区忘忧草| 国产日韩欧美一区二区三区四区| 国外成人在线| 亚洲欧美日韩在线不卡| 久久狠狠亚洲综合| 欧美黑人在线播放| 国产精品久在线观看| 黄色一区二区三区| 一本色道久久综合狠狠躁的推荐| 亚洲欧美另类中文字幕| 美女图片一区二区| 99在线热播精品免费| 久久久999精品| 国产精品区一区二区三| 亚洲国产精品久久久久秋霞影院 | 美女露胸一区二区三区| 欧美日韩国产欧美日美国产精品| 国产欧美va欧美va香蕉在| 亚洲国产精品第一区二区三区| 亚洲特级毛片| 欧美~级网站不卡| 亚洲一区精品电影| 欧美激情久久久久| 亚洲国产高潮在线观看| 午夜欧美不卡精品aaaaa| 亚洲国产视频一区| 久久精品99| 国产欧美一二三区| 亚洲调教视频在线观看| 亚洲高清av| 久久99伊人| 国产精品自在在线| 亚洲男女自偷自拍| 一本久道久久久| 欧美久久在线| 一区二区三区国产在线| 蜜臀av国产精品久久久久| 国产日产高清欧美一区二区三区| 亚洲一区二区三区四区五区午夜| 亚洲激情小视频| 免费在线亚洲欧美| 亚洲国产精品精华液网站| 毛片基地黄久久久久久天堂| 午夜精品影院在线观看| 国产欧美日韩在线播放| 香蕉免费一区二区三区在线观看 | 蜜臀av一级做a爰片久久| 狠狠色综合色综合网络| 久久深夜福利免费观看| 久久精品99国产精品酒店日本| 国产欧美在线视频| 久久久久久久久一区二区| 久久精品久久综合| 亚洲黄色一区二区三区| 91久久精品国产91性色tv| 亚洲第一精品夜夜躁人人躁| 米奇777超碰欧美日韩亚洲| 亚洲国产一区二区a毛片| 亚洲第一网站免费视频| 欧美国产专区| 中文一区字幕| 亚洲欧美精品在线观看| 国产一区高清视频| 亚洲国产精品综合| 国产精品成人国产乱一区| 欧美伊人久久大香线蕉综合69| 久久国产日韩欧美| 亚洲美女在线一区| 中日韩高清电影网| 国内精品伊人久久久久av影院| 久久精品国产999大香线蕉| 久久嫩草精品久久久精品一| 亚洲精品一区二区三区樱花| 日韩写真视频在线观看| 国产亚洲欧美一区二区| 亚洲国产老妈| 国产欧美精品在线播放| 欧美国产丝袜视频| 欧美日韩第一区| 久久福利毛片| 免费国产一区二区| 欧美主播一区二区三区| 欧美韩日精品| 久久视频一区二区| 欧美日韩一卡二卡| 美女精品在线| 国产欧美在线视频| 亚洲精品国精品久久99热| 欧美激情亚洲视频| 国产午夜精品美女毛片视频| 欧美激情小视频| 国产综合网站| 亚洲无玛一区| 亚洲欧洲日韩综合二区| 亚洲欧美日韩精品久久奇米色影视 | 欧美激情一二三区| 国产精品私拍pans大尺度在线| 老司机精品视频一区二区三区| 欧美日韩二区三区| 欧美高清日韩| 狠狠色狠狠色综合日日tαg| 亚洲视频欧洲视频| 亚洲精品国精品久久99热| 欧美影片第一页| 亚洲欧美日本另类| 欧美日韩麻豆| 亚洲精品日韩在线观看| 亚洲国产成人在线| 久久精品夜色噜噜亚洲aⅴ| 午夜精品一区二区三区四区| 欧美黄色小视频| 欧美大片第1页| 亚洲高清久久| 久久影视精品| 欧美a级一区| 在线成人国产| 久久久蜜桃精品| 欧美成人免费在线| 免费观看一区| 蜜臀av一级做a爰片久久| 国产午夜精品久久久久久免费视 | 欧美一级电影久久| 午夜在线精品偷拍| 国产伦精品一区二区三区高清| 亚洲视频一区在线观看| 亚洲欧美日韩精品久久久| 国产精品久久久久国产a级| 一区二区免费在线播放| 亚洲欧美日韩精品一区二区 | 99亚洲一区二区| 欧美精品三级日韩久久| 亚洲国产午夜| 日韩一级不卡| 欧美婷婷六月丁香综合色| 一本大道久久a久久精二百| 亚洲一区二区三区在线| 国产伦精品一区二区三| 久久精品国产亚洲一区二区三区 | 欧美一二三视频| 蜜桃视频一区| 夜夜嗨av一区二区三区四季av| 欧美日韩国产综合在线| 在线视频一区观看| 欧美在线视频一区二区三区| 国内精品久久久久久久影视蜜臀 | 亚洲区中文字幕| 亚洲私人影院| 国产日产高清欧美一区二区三区| 久久久久国色av免费观看性色| 麻豆精品91| 99国产精品久久久久久久久久 | 亚洲日本成人在线观看| 欧美手机在线| 久久高清国产| 99re6热只有精品免费观看| 羞羞答答国产精品www一本| 极品av少妇一区二区| 欧美精品18videos性欧美| 一本久久综合亚洲鲁鲁| 国产精品一区久久久| 久久一区精品| 中文成人激情娱乐网| 久久久亚洲精品一区二区三区 | 一区二区三区免费看| 国产精品视频观看| 久久综合国产精品台湾中文娱乐网| 亚洲精品综合精品自拍| 久久一综合视频| 亚洲女同同性videoxma| 亚洲第一搞黄网站| 国产精品久久久久一区二区三区共| 久久精品日韩| 亚洲一区二区精品在线| 亚洲成人资源| 国产精品久久久久久av福利软件 | 久久精品一区二区三区不卡| 亚洲美女淫视频| 在线看片第一页欧美| 国产精品日韩专区| 欧美精品一区在线| 久久久女女女女999久久| 亚洲综合999| 日韩亚洲一区在线播放| 亚洲成人在线视频网站| 久久久国产视频91| 在线视频免费在线观看一区二区| 欧美成人免费网| 美日韩丰满少妇在线观看| 久久精品99国产精品日本| 亚洲欧美激情一区二区|