• <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>

            地址

            Posted on 2010-06-07 17:02 莫失莫忘 閱讀(158) 評論(0)  編輯 收藏 引用
            http://dev.csdn.net/htmls/42/42883.html
            http://www.vckbase.com/document/viewdoc/?id=1440
            http://g.csdn.net/5143319
            http://d.download.csdn.net/down/889596/xuezhimeng
            http://www.pconline.com.cn/download/heji/0901/1549110_1.html
            http://cache.baidu.com/c?m=9d78d513d98401ae4fece4697b16c0126f43f1662ba0d4013894cd47c9221d03506790a63a644b5383966b6776ff1a07bcb7217240527de8869c9f4ba9e2da3f2efe223f701b854511d918&p=8c70c64ad4934eae13f1c9214e&user=baidu
            http://tieba.baidu.com/f?kz=714213830
            http://cache.baidu.com/c?m=9d78d513d9d437ae4f9ce3697c62c0161c4381132ba7a4020bd48438e2732d305321a3e52878564291d27d141cb20c19afe73605754476eb8cc8ff1b80e48f7e72cd7b6a2d4fd00012d01cb28a1b628171c70bb4f94efaffab6ec5f39792c208048c16583ad9eddd0d46479131f31631e2a59f49025f67e0ab6f3b&p=c6769a45c5d917ff57eb9435455f&user=baidu
            http://www.baidu.com/s?tn=16site_5_pg&bs=%D3%CE%CF%B7%BC%DC%B9%B9&f=8&wd=%D3%CE%CF%B7%BF%F2%BC%DC
            http://www.pudn.com/downloads217/sourcecode/windows/network/detail1023143.html
            碰撞檢測:
            http://dev.gameres.com/Program/Visual/3D/3DCollision.mht
            http://wenku.baidu.com/view/c317e65c3b3567ec102d8a58.html
            http://tieba.baidu.com/f?kw=%D0%C7%BC%CA%B9%A4%D7%F7%CA%D2
            2D碰撞檢測引擎(相關(guān)文章):
            http://www.baidu.com/s?bs=Irrlicht+%C5%F6%D7%B2%BC%EC%B2%E2&f=8&wd=Irrlicht+2D%C5%F6%D7%B2%BC%EC%B2%E2
            http://blog.csdn.net/aladins/archive/2007/01/14/1482595.aspx
            http://www.baidu.com/s?wd=SDL%C5%F6%D7%B2%BC%EC%B2%E2
            http://www.verycd.com/files/955e419766a2ed8672472f3ce4180c8c22445512
            SDL:
            http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f729778693027fa3cf1fd5790f1c0721bca66178505380936b6777ac4257e0fb3565377523a09bbe8b5dddccc86e70d633712d5cd04e538547b8ca3632b02a872d99b868e6ad813584afa2c4af5544be54120a80e7fb2c&p=8b2a9503cc934eae52bacd3e510c&user=baidu
            http://wenku.baidu.com/view/5ecb3b0cba1aa8114431d91b.html
            關(guān)于游戲編程的一些其他的東西
            http://www.fish888.com/Quake2-MD2-t172272
            http://zhidao.baidu.com/question/5641067.html
            http://bbs.gameres.com/showthread.asp?threadid=147168
            http://www.baidu.com/s?wd=C%D3%CE%CF%B7%B1%E0%B3%CC%B4%D3%C8%EB%C3%C5%B5%BD%BE%AB%CD%A8
            http://dev.gameres.com/Program/Abstract/Thinking/RLE.htm
            http://www.baidu.com/s?bs=2D%D3%CE%CF%B7+%C5%F6%D7%B2%BC%EC%B2%E2%BF%E2&f=8&wd=%D3%CE%CF%B7+%C5%F6%D7%B2%BC%EC%B2%E2%BF%E2
            模擬城市的源代碼
            http://resource.gameres.com/simcity_source.zip

            如果這個沒有刷出來就用關(guān)鍵字:用SDL打造我們自己的戰(zhàn)棋游戲。

              通過運行時類型識別(RTTI)(Run-Time Type Information),程序能夠使用基類的指針或引用來檢查這些指針或引用所指的對象的實際派生類型。   RTTI提供了一下兩個非常有用的操作符:  ?。?)typeid操作符,返回指針和引用所指的實際類型;   (2)dynamic_cast操作符,將基類類型的指針或引用安全地轉(zhuǎn)換為派生類型的指針或引用。   面向?qū)ο蟮木幊陶Z言,象C++,Java,delphi都提供了對RTTI的支持。 本文將簡略介紹 RTTI 的一些背景知識、描述 RTTI 的概念,并通過具體例子和代碼介紹什么時候使用以及如何使用 RTTI;本文還將詳細(xì)描述兩個重要的 RTTI 運算符的使用方法,它們是 typeid 和 dynamic_cast。   其實,RTTI 在C++中并不是什么新的東西,它早在十多年以前就已經(jīng)出現(xiàn)了。但是大多數(shù)開發(fā)人員,包括許多高層次的C++程序員對它并不怎么熟悉,更不用說使用 RTTI 來設(shè)計和編寫應(yīng)用程序了。   一些面向?qū)ο髮<以趥鞑プ约旱脑O(shè)計理念時,大多都主張在設(shè)計和開發(fā)中明智地使用虛擬成員函數(shù),而不用 RTTI 機制。但是,在很多情況下,虛擬函數(shù)無法克服本身的局限。每每涉及到處理異類容器和根基類層次(如 MFC)時,不可避免要對對象類型進行動態(tài)判斷,也就是動態(tài)類型的偵測。如何確定對象的動態(tài)類型呢?答案是使用內(nèi)建的 RTTI 中的運算符:typeid 和 dynamic_cast。   在C++中存在虛函數(shù),也就存在了多態(tài)性,對于多態(tài)性的對象,在程序編譯時可能會出現(xiàn)無法確定對象的類型的情況。當(dāng)類中含有虛函數(shù)時,其基類的指針就可以指向任何派生類的對象,這時就有可能不知道基類指針到底指向的是哪個對象的情況,類型的確定要在運行時利用運行時類型標(biāo)識做出。為了獲得一個對象的類型可以使用typeid函數(shù),該函數(shù)反回一個對type_info類對象的引用,要使用typeid必須使用頭文件<typeinfo>,因為typeid是一個反回類型為typ_info的引用的函數(shù)所以這里有必要先介紹一下type_info類    1、typid函數(shù):該函數(shù)的主要作用就是讓用戶知道當(dāng)前的變量是什么類型的,比如使用typid(a).name()就能知道變量a是什么類型的。因為typid()函數(shù)是一個反回類型為typid_info類型的函數(shù),所以下面先對type_info類作下介紹   2、type_info類:該類的具體實現(xiàn)方式依編譯器而定,但一般都有如下的成員定義   class type_info   {private:   type_info(const type_info &);   type_info& operator =(const type_info&); //type_info類的復(fù)制構(gòu)造函數(shù)和賦值運算符是私有的。   public:   virtual ~type_info(); //析構(gòu)函數(shù)   bool operator = =(const type_info&) const; //在type_info類中重載了= =運算符,該運算符可以比較兩個對象的類型是否相等。   bool operator !=(const type_info&)const; //重載的!=運算符,以比較兩個對象的類型是否不相等   const char * name() const; //使用得較多的成員函數(shù)name,該函數(shù)反回對象的類型的名字。前面使用的typeid(a).name()就調(diào)用了該成員函數(shù)   bool before(const type_info&);};   因為type_info類的復(fù)制構(gòu)造函數(shù)和賦值運算符都是私有的,所以不允許用戶自已創(chuàng)建type_info的類,比如type_info A;錯誤,沒有默認(rèn)的構(gòu)造函數(shù)。唯一要使用type_info類的方法就是使用typeid函數(shù)。   3、typeid函數(shù)怎樣創(chuàng)建type_info類的對象:該函數(shù)反回type_info類對象的引用,即形式為type_info& typid();因此也可以說typid函數(shù)是type_info類的一個引用對象,可以訪問type_info類的成員。但因為不能創(chuàng)建type_info類的對象,而typeid又必須反回一個類型為type_info類型的對象的引用,所以怎樣在typeid函數(shù)中創(chuàng)建一個type_info類的對象以便讓函數(shù)反回type_info類對象的引用就成了問題。這可能是把typid函數(shù)聲明為了type_info類的友元函數(shù)來實現(xiàn)的,默認(rèn)構(gòu)造函數(shù)是私有的并不能阻止該類的友元函數(shù)創(chuàng)建該類的對象。所以typeid函數(shù)如果是友元的話就可以訪問type_info類的私有成員,從而可以創(chuàng)建type_info類的對象,從而可以創(chuàng)建反回類型為type_info類的引用。舉個例子class A{private:A(){} A(const A&){} A& operator =(const A&){} friend A& f();};這里把類A的默認(rèn)構(gòu)造函數(shù),復(fù)制構(gòu)造函數(shù)和賦值操作符定為私有從而防止創(chuàng)建類A的對象,但函數(shù)f()是類A的友元,所以在函數(shù)f()中可以創(chuàng)建類A的對象。同時為了實現(xiàn)函數(shù)f()反回的對象類型是A的引用,就必須在函數(shù)f中創(chuàng)建一個類A的對象以作為函數(shù)f的反回值,比如函數(shù)f可以這樣定義A& f(){A ma; cout<<”f”<<endl; return ma}。   4、因為typeid函數(shù)是type_info類的對象,也就是說可以用該函數(shù)訪問type_info類的成員,即type_info類中重載的= =和!=運算符,name()和before()成員函數(shù),比如typid(a).naem()和typid(a)= =typid(b)等等。   5、typeid函數(shù)的使用原理:該函數(shù)的形式為type_info& typeid(object)其中object是任何類型的對象,可以是內(nèi)置類型和用戶創(chuàng)建的類類型。可以看出typeid即是一個函數(shù),同時他也是type_info類的對象,即typeid可以訪問類type_info類的成員,也可以做為一個單獨的函數(shù)來使用。做個簡單的例子,比如   class A{private: A(){b=3;cout<<”A”<<endl;} //私有的默認(rèn)構(gòu)造函數(shù)   public: void name(){cout<<”NA”<<endl;} int b;   friend A f();}; //函數(shù)f()是類A的友元,因此在f中可以創(chuàng)建類A的對象。   A f() //函數(shù)f()在這里即是類A的一個對象,也是一個單獨的函數(shù)。   { A m; //創(chuàng)建類A的對象,因為函數(shù)f是類A的友元,因此可以創(chuàng)建類A的對象   cout<<”F”<<endl; return m;}   main()   { f().name(); //函數(shù)f()作為類A的對象使用,這里要注意程序的執(zhí)行順序,首先執(zhí)行函數(shù)f()中的語句A m,因此調(diào)用類A的默認(rèn)構(gòu)造函數(shù)輸出A,然后執(zhí)行A m;后面的語句,輸出F,再然后調(diào)用類A中的成員函數(shù)name輸出NA.   f(); } //函數(shù)f()單獨作為函數(shù)使用。   我們創(chuàng)建一個類A,其中A的默認(rèn)構(gòu)造函數(shù)是私有的,也就是說不能用默認(rèn)構(gòu)造函數(shù)創(chuàng)建類A的對象。函數(shù)f()是類A的友元,且反回一個類A的對象,因為f()函數(shù)是類A的友元,所以在函數(shù)f中可以用默認(rèn)構(gòu)造函數(shù)創(chuàng)建類A的對象,這時函數(shù)f()同時是一個函數(shù),也是類A的對象,因此也可以訪問類A中的成員。   6、typeid函數(shù)使用方式一:使用type_info類中的name()成員函數(shù)反回對象的類型的名稱。其方法為:typeid(object).name()其中object是要顯示的對象的類型名,該函數(shù)反回的名字因編譯器而定。這里要注意的就是使用方式一中提到的虛函數(shù)類型的問題,即如果有類A,且有虛函數(shù),類B,C,D都是從類A派生的,且都重定義了類A中的虛函數(shù),這時有類A的指針p,再把對象類B的對象的地址賦給指針p,則typeid(p).name()將反回的類型將是A*,因為這里的p表示的是一個指針,該指針是類型為A的指針,所以反回A*,而typeid(*p).name()將反回B,因為指針p是指向類B的對象的,而*p就表示的是類B的對象的類型,所以反回B。   7、typeid函數(shù)使用方式二:使用type_info類中重載的= =與!=比較兩個對象的類型是否相等。使用該方法需要調(diào)用類type_info中重載的= =和!=操作符,其使用方法為typid(object1)= =typid(object2);如果兩個對象的類型相等則反回1,如果不相等則為0。這種使用方法通常用于比較兩個帶有虛函數(shù)的類的對象是否相等,比如有類A,其中定義有虛函數(shù),而類B,類C,類D,都是從類A派生而來的且重定義了該虛函數(shù),這時有個類A的指針p和p1,按照虛函數(shù)的原理,基類的指針可以指向任何派生類的對象,在這時就有可能需要比較兩個指針是否指向同一個對象,這時就可以這樣使用typeid了,typeid(*p)= =typeid(*p1);這里要注意的是typeid(*p)與typeid(p)是指的不同的對象類型,typeid(p)表示的是p的類型,在這里p是一個指針,這個指針指向的是類A的對象,所以p的類型是A*,而typeid(*p)則不一樣,*p表示的是指針p實際所指的對象的類型,比如這里的指針p指向派生類B,則typeid(*p)的類型為B。所以在測試兩個指針的類型是否是相等時應(yīng)使用*p,即typeid(*p)= =typeid(*p1)。如果是typeid(p)= =typeid(p1)的話,則無論指針p和p1指向的什么派生類對象,他們都是相等的,因為都是A *的類型。   8、強制類型轉(zhuǎn)換運算符:C++有四種強制類型轉(zhuǎn)換符,分別是dynamic_cast,const_cast,static_cast,reinterpret_cast。其中dynamic_cast與運行時類型轉(zhuǎn)換密切相關(guān),在這里我們先介紹dynamic_cast,其他三種在后面介紹。   8.1、dynamic_cast強制轉(zhuǎn)換運算符:該轉(zhuǎn)換符用于將一個指向派生類的基類指針或引用轉(zhuǎn)換為派生類的指針或引用,注意dynamic_cast轉(zhuǎn)換符只能用于含有虛函數(shù)的類,其表達(dá)式為dynamic_cast<類型>(表達(dá)式),其中的類型是指把表達(dá)式要轉(zhuǎn)換成的目標(biāo)類型,比如含有虛函數(shù)的基類B和從基類B派生出的派生類D,則B *pb; D *pd, md; pb=&md; pd=dynamic<D*>(pb); 最后一條語句表示把指向派生類D的基類指針pb轉(zhuǎn)換為派生類D的指針,然后將這個指針賦給派生類D的指針pd,有人可能會覺得這樣做沒有意義,既然指針pd要指向派生類為什么不pd=&md;這樣做更直接呢?有些時候我們需要強制轉(zhuǎn)換,比如如果指向派生類的基類指針B想訪問派生類D中的除虛函數(shù)之外的成員時就需要把該指針轉(zhuǎn)換為指向派生類D的指針,以達(dá)到訪問派生類D中特有的成員的目的,比如派生類D中含有特有的成員函數(shù)g(),這時可以這樣來訪問該成員dynamic_cast<D*>(pb)->g();因為dynamic_cast轉(zhuǎn)換后的結(jié)果是一個指向派生類的指針,所以可以這樣訪問派生類中特有的成員。但是該語句不影響原來的指針的類型,即基類指針pb仍然是指向基類B的。如果單獨使用該指針仍然不能訪問派生類中特有的成員。一般情況下不推見這樣使用dynamic_cast轉(zhuǎn)換符,因為dynamic_cast的轉(zhuǎn)換并不會總是成功的,具體情況在后面介紹。   8.2、dynamic_cast的注意事項:dynamic_cast轉(zhuǎn)換符只能用于指針或者引用。dynamic_cast轉(zhuǎn)換符只能用于含有虛函數(shù)的類。dynamic_cast轉(zhuǎn)換操作符在執(zhí)行類型轉(zhuǎn)換時首先將檢查能否成功轉(zhuǎn)換,如果能成功轉(zhuǎn)換則轉(zhuǎn)換之,如果轉(zhuǎn)換失敗,如果是指針則反回一個0值,如果是轉(zhuǎn)換的是引用,則拋出一個bad_cast異常,所以在使用dynamic_cast轉(zhuǎn)換之間應(yīng)使用if語句對其轉(zhuǎn)換成功與否進行測試,比如pd=dynamic_cast<D*>(pb); if(pd){…}else{…},或者這樣測試if(dynamic_cast<D*>(pb)){…}else{…}。   8.3、const_cast操作符:其表達(dá)式為const_cast<類型>(表達(dá)式),其中類型指要把表達(dá)式轉(zhuǎn)換為的目標(biāo)類型。該操作符用于改變const和volatile,const_cast最常用的用途就是刪除const屬性,如果某個變量在大多數(shù)時候是常量,而在某個時候又是需要修改的,這時就可以使用const_cast操作符了。const_cast操作符不能改變類型的其他方面,他只能改變const或volatile,即const_cast不能把int改變?yōu)閐ouble,但可以把const int改變?yōu)閕nt。const_cast只能用于指針或引用。const_cast的用法舉例比如:int a=3; const int *b=&a; int* c; c=const_cast<int*>(b); *c=4; cout<<a<<*c;這時輸出兩個4,如果不使用const_cast轉(zhuǎn)換符則常量指針*c的值是不能改變的,在這里使用const_cast操作符,通過指針b就能改變常量指針和變量a的值。   8.4、static_cast操作符:該操作符用于非多態(tài)類型的轉(zhuǎn)換,任何標(biāo)準(zhǔn)轉(zhuǎn)換都可以使用他,即static_cast可以把int轉(zhuǎn)換為double,但不能把兩個不相關(guān)的類對象進行轉(zhuǎn)換,比如類A不能轉(zhuǎn)換為一個不相關(guān)的類B類型。static_cast本質(zhì)上是傳統(tǒng)c語言強制轉(zhuǎn)換的替代品。   8.5、reinterpret_cast操作符:該操作符用于將一種類型轉(zhuǎn)換為另一種不同的類型,比如可以把一個整型轉(zhuǎn)換為一個指針,或把一個指針轉(zhuǎn)換為一個整型,因此使用該操作符的危險性較高,一般不應(yīng)使用該操作符。   9、使用 typeid 要注意一個問題,那就是某些編譯器(如 Visual C++)默認(rèn)狀態(tài)是禁用 RTTI 的,目的是消除性能上的開銷。如果你的程序確實使用了 RTTI,一定要記住在編譯前啟用 RTTI。使用 typeid 可能產(chǎn)生一些將來的維護問題。假設(shè)你決定擴展上述的類層次,從MediaFile 派生另一個叫 LocalizeMedia 的類,用這個類表示帶有不同語言說明文字的媒體文件。但 LocalizeMedia 本質(zhì)上還是個 MediaFile 類型的文件。因此,當(dāng)用戶在該類文件圖標(biāo)上單擊右鍵時,文件管理器必須提供一個“播放”菜單??上?build()成員函數(shù)會調(diào)用失敗,原因是你沒有檢查這種特定的文件類型。為了解決這個問題,你必須象下面這樣對 build() 打補?。?  void menu::build(const File * pfile)   {   //......   else if (typeid(*pfile)==typeid(LocalizedMedia))   {   add_option("play");   }   }   唉,這種做法真是顯得太業(yè)余了,以后每次添加新的類,毫無疑問都必須打類似的補丁。顯然,這不是一個理想的解決方案。這個時候我們就要用到 dynamic_cast,這個運算符用于多態(tài)編程中保證在運行時發(fā)生正確的轉(zhuǎn)換(即編譯器無法驗證是否發(fā)生正確的轉(zhuǎn)換)。用它來確定某個對象是 MediaFile 對象還是它的派生類對象。dynamic_cast 常用于從多態(tài)編程基類指針向派生類指針的向下類型轉(zhuǎn)換。它有兩個參數(shù):一個是類型名;另一個是多態(tài)對象的指針或引用。其功能是在運行時將對象強制轉(zhuǎn)換為目標(biāo)類型并返回布爾型結(jié)果R簿褪撬擔(dān)綣煤曬Φ夭⑶沂嵌慕?*pfile 強制轉(zhuǎn)換為 MediaFile,那么 pfile的動態(tài)類型是 MediaFile 或者是它的派生類。否則,pfile 則為其它的類型:   void menu::build(const File * pfile)   {   if (dynamic_cast <MediaFile *> (pfile))   {   // pfile 是 MediaFile 或者是MediaFile的派生類 LocalizedMedia   add_option("play");   }   else if (dynamic_cast <TextFile*> (pfile))   {   // pfile 是 TextFile 是TextFile的派生類   add_option("edit");   }   }   細(xì)細(xì)想一下,雖然使用 dynamic_cast 確實很好地解決了我們的問題,但也需要我們付出代價,那就是與 typeid 相比,dynamic_cast 不是一個常量時間的操作。為了確定是否能完成強制類型轉(zhuǎn)換,dynamic_cast`必須在運行時進行一些轉(zhuǎn)換細(xì)節(jié)操作。因此在使用 dynamic_cast 操作時,應(yīng)該權(quán)衡對性能的影響。

            posts - 15, comments - 0, trackbacks - 0, articles - 0

            Copyright © 莫失莫忘

            欧美成人免费观看久久| 久久久WWW免费人成精品| 久久亚洲精品国产精品婷婷| 色欲综合久久躁天天躁| 少妇人妻综合久久中文字幕| 一本色道久久99一综合| 777久久精品一区二区三区无码 | 一本色道久久88—综合亚洲精品| 人妻精品久久久久中文字幕69 | 久久久噜噜噜久久中文字幕色伊伊| 久久综合偷偷噜噜噜色| 精品久久久久久国产91| 久久国产免费| 99久久精品毛片免费播放| 亚洲午夜福利精品久久| 91精品国产高清久久久久久91 | 国产成人精品久久亚洲高清不卡| 亚洲日本久久久午夜精品| 97久久精品午夜一区二区| 久久久久久久免费视频| 精品久久久久久国产牛牛app| 午夜不卡久久精品无码免费| 久久性生大片免费观看性| 久久中文娱乐网| 亚洲αv久久久噜噜噜噜噜| 性高湖久久久久久久久AAAAA| 中文字幕一区二区三区久久网站| 午夜不卡久久精品无码免费| 国内精品久久久久久久久电影网| 久久久久婷婷| 久久国产高清一区二区三区| 精品综合久久久久久97超人| 国产精品女同久久久久电影院| 国内精品人妻无码久久久影院导航 | 国产99久久久国产精品~~牛| 国内精品久久九九国产精品| 精品久久8x国产免费观看| 色综合久久久久综合体桃花网| 狠狠色婷婷久久综合频道日韩 | 一级做a爱片久久毛片| 99国产欧美精品久久久蜜芽|