锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
妯℃嫙瀹冪殑MVO鏋舵瀯錛屼笉榪囨病鏈夊師浠g爜錛屾墍浠ュ緢闅綼
璁捐浜嗕竴涓氦浜掔粯鍥懼熀鏈被錛?br />浣嗘槸榪樻湁閿欒錛岄紶鏍囧乏閿偣鍑諱袱涓?br />聽winGDI.cpp涓嚭閿欍?br />璇峰ぇ铏炬寚鏁欎竴浜屻?br />鎴戝凡緇忓湪榪欎釜闂涓婅姳浜嗗緢澶氱殑蹇冩濄?br />鍏朵腑鏈閲嶈鐨勫氨鏄疨ainter鎶借薄綾葷殑璁捐
浠栫殑瀛愮被QBufferDC緇ф壙CDC
鑰孲GView鍖呭惈Painter鎸囬拡錛屾柟渚垮湪SGView ::drawEntity璋冪敤銆?br />
SGObject - 瀵硅薄鐨勬娊璞$被錛屼篃灝辨槸鍑犱綍瀵硅薄
SGModel- 璐熻矗瀵硅薄綆$悊錛屾病鏈夊疄鐜版墍鏈夌殑鍔熻兘錛屽噯澶囩敤SceneTree鏉ュ疄鐜?br />SGView - 璐熻矗鏄劇ずSGModel涓殑鏁版嵁錛屽叧閿殑鍑芥暟
void SGView::drawEntity(SGObject* pObj)
{
聽聽聽pObj->draw(m_pPainter,this)
}
Painter - 灝佽CDC鐨勫姛鑳?瑙佷唬鐮?br />
鍦–SGView鍒涘緩鐨勬椂鍊欏垱寤篜ainter瀵硅薄
寰堝彲鑳借繖閲屾湁闂錛侊紒錛侊紒錛?br />void CSGView::OnCreate(..)
{
聽聽聽聽聽CDC*聽pDC =聽GetDC();
聽聽聽Painter* painter = new QBufferDC(pDC);
聽聽聽m_pSGView->setPainter(painter);
}
MFC 鐩稿叧鐨凞ocument/View鏋舵瀯
CSGDocument - 綆$悊SGModel
CSGView - 鍜孲GView寤虹珛鑱旂郴錛屽茍璐熻矗鎶妛indows鐨勬秷鎭彂閫佺粰SGView
瑙佸師浠g爜
SGActionManager - 璐熻矗宸ュ叿鐨勭鐞?br />SGBaseAction - 宸ュ叿鐨勬娊璞″熀綾?br />SGActionDrawLine - 緇樺埗鐩寸嚎鐨勫伐鍏?br />
婧愪唬鐮佽繛鎺ワ細
http://www.shnenglu.com/Files/richardzeng/MVOTest.rar
鐢葷瑪錛岀敾鍒風瓑璧勬簮緇ф壙resource
涓轟簡閬垮厤鍙戠敓璧勬簮娉勯湶鍜宺esource鐨勭鐞?br />璁捐ResourceManager綾伙紝璐熻矗璧勬簮鐨勫垱寤猴紝鍔犺澆鍜屽嵏杞戒互鍙婂垹闄?/p>
涓や釜鎶借薄綾?Resource 鍜?ResourceManager
涓や釜鍏蜂綋綾?ConcreateResource 鍜?ConcreateResourceManager
鍒嗗埆媧劇敓浜庝笂闈㈢殑鎶借薄綾?/p>
浠ヤ笂璁捐鏄湅浜?OGRE 娓告垙寮曟搸鐨勮祫婧愮鐞嗛儴鍒嗭紝
瀵瑰畠鐨勮祫婧愮鐞嗙被ResourceManager涓嶆槸寰堢悊瑙?/p>
resource 媧劇敓浜唒en,brush絳夌被
pen綾誨彲浠ユ潵鑷枃浠訛紝涔熷彲浠ヨ嚜宸卞垱寤篠ubPen 娣誨姞鍒癝ubPenList涓?/p>
ResourceManager 璐熻矗鍒涘緩璧勬簮Resource
1. 濡傛灉鎴戝湪鎶借薄鐨?ResourceManager 澹版槑 createRes鍑芥暟錛屽茍榪斿洖鍩虹被resource
鍔垮繀浼氳寮哄埗杞崲錛岀劧鍚庡湪鐢ㄥ埌鍏蜂綋鐨凴esource鏃跺欏張瑕佽漿鎹㈠洖鏉?/p>
2. 濡傛灉鎴戝湪鍏蜂綋綾?ConcreateResourceManager 澹版槑 createConcreateRes鍑芥暟
閭d箞灝辯櫧璐逛簡鎴戝簲鐢ㄨ璁℃ā寮忚璁¤繖涔堝綾?/p>
// abstract class for resource
class Resource{
public:
聽// standard constructor
聽 Resource(const string& name, const string& group)
聽:mName(name),mGroup(group){}
聽 ~Resource(){}
protected:
聽// prevent default construct
聽 Resource():mName(""),mGroup(""){}
聽 string mName;
聽 string mGroup;
聽 static unsigned long mHandle;
};
// subclass of resource
// concreateResource such as PEN
class Pen:
聽public Resource{
聽Pen(const string& name, const string& group)
聽聽:Resource(name,group){}
聽聽~Pen(){}
聽 void loadfromFile(string& filename);
// add聽into vector
聽 void addSubPen(SubPen* sub){
聽聽聽聽 mSubPenList.push_back(sub);
}
public:
typedef std::vector<SubPen> SubPenList;
SubPenList mSubPenList;
};
class
// abstract class for resource manager
class ResourceManager{
public:
聽 ResourceManager(){}
聽 ~ResourceManager(){}
public:
// here , I cannot understand OGRE degsin
聽 Resource* createRes(const string& name,const string& group);
聽// resource map
銆typedef std::map<string,Resource*> ResourceMap;
聽聽 ResourceMap mResources;
};
// subclass ResourceManager
class ConcreateResourceManager
聽:public ResourceManager
{
聽ConcreateResourceManager(){}
聽~ConcreateResourceManager(){}
聽聽聽聽聽 // how can design here!!
聽聽聽聽聽聽 Pen* createPen(const string& name,const string& group){}
}
聽
#include <iostream>
聽
using namespace std;
聽
//鍗曚歡妯℃澘綾?/div>
template<typename T> class Singleton
{
protected:
聽
聽 static T* m_Instance;
聽
聽 Singleton(){}
聽 virtual~Singleton(){}
聽
public:
聽
聽 //瀹炰緥鐨勮幏寰?/div>
聽 static T* Instance()
聽 {
聽聽聽 if(m_Instance==0)
聽聽聽聽聽 m_Instance=new T;
聽
聽聽聽 return m_Instance;
聽 }
聽
聽 //鍗曚歡綾葷殑閲婃斁
聽 virtual void Release()
聽 {
聽聽聽 if(m_Instance!=0)
聽聽聽 {
聽聽聽聽聽 delete m_Instance;
聽聽聽聽聽 m_Instance=0;
聽聽聽 }
聽 }
};
聽
//鍗曚歡妯℃澘嫻嬭瘯綾?/div>
class Test:public Singleton<Test>
{
聽 friend class Singleton<Test>; //澹版槑涓哄弸鍛橈紝涓嶇劧浼氬嚭閿?/div>
protected:
聽 Test()
聽 {
聽聽聽 a=b=c=0;
聽 }
聽 virtual ~Test(){}
聽
public :
聽
聽 int a;
聽 int b;
聽 int c;
};
聽
//鍒濆鍖栭潤鎬佹垚鍛樸傘傘?/div>
template<> Test*Singleton<Test>::m_Instance=0;
聽
聽
//浠ヤ笅涓烘祴璇曚唬鐮?/div>
void main()
{
聽 Test*t=Test::Instance();
聽
聽 t->a=5;
聽 t->b=25;
聽 t->c=35;
聽 cout<<"t: a="<<t->a<<" b="<<t->b<<" c="<<t->c<<endl;
聽
聽 Test*t2;
聽 t2=Test::Instance();
聽 cout<<"t2 a="<<t2->a<<" b="<<t2->b<<" c="<<t2->c<<endl;
聽
聽 t2->Release();
}
|
char toUpper(const char& ch) { return ch & 0x5F; } char toLower(const char& ch) { return ch | 0x20; } |
瀛楁鍚?/SPAN> |
瀛楄妭鏁?/SPAN> |
綾誨瀷 |
鎻忚堪 |
Total_Length |
4 |
Unsigned Integer |
娑堟伅鎬婚暱搴?/SPAN>(鍚秷鎭ご鍙婃秷鎭綋) |
Command_Id |
4 |
Unsigned Integer |
鍛戒護鎴栧搷搴旂被鍨?/SPAN> |
Sequence_Id |
4 |
Unsigned Integer |
娑堟伅嫻佹按鍙?/SPAN>,欏哄簭绱姞,姝ラ暱涓?/SPAN>1,寰幆浣跨敤錛堜竴瀵硅姹傚拰搴旂瓟娑堟伅鐨勬祦姘村彿蹇呴』鐩稿悓錛?/SPAN> |
瀛楁鍚?/SPAN> |
瀛楄妭鏁?/SPAN> |
灞炴?/SPAN> |
鎻忚堪 |
Source_Addr |
6 |
Octet String |
婧愬湴鍧錛屾澶勪負SP_Id錛屽嵆SP鐨勪紒涓氫唬鐮併?/SPAN> |
AuthenticatorSource |
16 |
Octet String |
鐢ㄤ簬閴村埆婧愬湴鍧銆傚叾鍊奸氳繃鍗曞悜MD5 hash璁$畻寰楀嚭錛岃〃紺哄涓嬶細 AuthenticatorSource = MD5錛?/SPAN>Source_Addr+9 瀛楄妭鐨?/SPAN>0 +shared secret+timestamp錛?/SPAN> Shared secret 鐢變腑鍥界Щ鍔ㄤ笌婧愬湴鍧瀹炰綋浜嬪厛鍟嗗畾錛?/SPAN>timestamp鏍煎紡涓猴細MMDDHHMMSS錛屽嵆鏈堟棩鏃跺垎縐掞紝10浣嶃?/SPAN> |
Version |
1 |
Unsigned Integer |
鍙屾柟鍗忓晢鐨勭増鏈彿(楂樹綅4bit琛ㄧず涓葷増鏈彿,浣庝綅4bit琛ㄧず嬈$増鏈彿)錛屽浜?/SPAN>3.0鐨勭増鏈紝楂?/SPAN>4bit涓?/SPAN>3錛屼綆4浣嶄負0 |
Timestamp |
4 |
Unsigned Integer |
鏃墮棿鎴崇殑鏄庢枃,鐢卞鎴風浜х敓,鏍煎紡涓?/SPAN>MMDDHHMMSS錛屽嵆鏈堟棩鏃跺垎縐掞紝10浣嶆暟瀛楃殑鏁村瀷錛屽彸瀵歸綈 銆?/SPAN> |
FeedBack:
int A(char *p); // 鍥炶皟鍑芥暟
typedef int(*CallBack)(char *p) ; // 澹版槑CallBack 綾誨瀷鐨勫嚱鏁版寚閽?
CallBack myCallBack ; // 澹版槑鍑芥暟鎸囬拡鍙橀噺
myCallBack = A; // 寰楀埌浜嗗嚱鏁癆鐨勫湴鍧
B(CallBack lpCall,char *pProvide)
{
銆........... // B 鐨勮嚜宸卞疄鐜板姛鑳借鍙?BR>銆lpCall(PpProvide); // 鍊熷姪鍥炶皟瀹屾垚鐨勫姛鑳?錛屼篃灝辨槸A鍑芥暟鏉ュ鐞嗙殑銆?
銆........... // B 鐨勮嚜宸卞疄鐜板姛鑳借鍙?BR>}
// -------------- 浣跨敤渚嬪瓙 -------------
char *p = "hello!";
CallBack myCallBack ;
myCallBack = A ;
B(A, p);
class CUploadFile : public CDialog
{
銆......
銆int Send(LPCTSTR lpServerIP, LPCTSTR lpServerPort, LPCTSTR UploadFilePath) ;
銆static int GetCurState(int nCurDone, int nInAll, void * pParam) ;
銆......
}
int CUploadFile ::Send(LPCTSTR lpServerIP, LPCTSTR lpServerPort, LPCTSTR UploadFilePath)
{
銆... // 瀵煎嚭浼犺緭鏁版嵁鐨勫嚱鏁?
銆int ret = Upload( (LPSTR)(LPCTSTR)m_strData,
銆銆銆銆GetCurState, // 鍦ㄨ繖涓洖璋冨嚱鏁頒腑澶勭悊鐣岄潰
銆銆銆銆this, // CUploadFile 鐨勮嚜韜寚閽?錛屼篃灝辨槸pParam 鎵鎺ュ彈鐨勫弬鏁?
銆銆銆銆(LPSTR)(LPCTSTR)UploadFilePath,
銆銆銆銆"",
銆銆銆銆"",
銆);
}
int CUploadFile ::GetCurState(int nCurData, int nInAll, void * pParam)
{
銆.........
銆UploadFile *pThis = (UploadFile *)pParam; // nCurData 褰撳墠浠ヤ紶鍑虹殑鏁版嵁閲?
銆// nInAll 鎬葷殑鏁版嵁閲?BR>銆// 鏈変簡pThis鍙互瀵圭晫闈㈣繘琛屽悇縐嶆搷浣滀簡銆?
銆.............
}
class CUploadData
{
銆......
銆typedef int(*SetUploadCaller)(int nCurData, int nInAll, void * pParam);
銆int UploadFile(LPCTSTR lpFileNamePath,LPVOID lparam,SetUploadCaller Caller );
銆// 鎺ュ彈澶栫晫鍑哄叆鐨勫弬鏁?涓昏鏄洖璋冨嚱鏁扮殑鍦板潃閫氳繃鍙傛暟Caller,
銆int Send(LPCTSTR lpServerIP, LPCTSTR lpServerPort, LPCTSTR UploadFilePath) ;
銆...... // 娉ㄦ剰姝ゆ椂涓嶅湪闇瑕丟etCurState 鍑芥暟浜?銆?BR>}
class CShowGUI: public CDialog
{
銆.......
銆typedef int(*SetUploadCaller)(int nCurData, int nInAll, void * pParam);
銆void SetCallBack(LPCTSTR strPath);
銆static int GetCurState(int nCurData, int nInAll, void * pParam) ;
銆CUploadData m_Uploa
銆d ; // 鏁版嵁涓婁紶綾繪槸鐣岄潰鏄劇ず綾葷殑涓涓垚鍛樺彉閲忋?
銆.......
}
void CShowGUI :: SetCallBack(LPCTSTR strPath)
{
銆CUploadData myUploadData ;
銆SetUploadCaller myCaller; // 澹版槑涓涓嚱鏁版寚閽堝彉閲?
銆myCaller = CurState ; // 鍙栧緱鐣岄潰澶勭悊鍑芥暟鐨勫湴鍧
銆myUploadData .UploadFile(strPath,this,myCaller); // 鐣岄潰澶勭悊綾葷殑鍑芥暟浼犲叆,瀹炵幇浜嗘暟鎹紶鍏ヤ笌鐣岄潰澶勭悊鐨勫垎紱?.
}
銆銆fp 鏄竴涓吀鍨嬬殑鍑芥暟鎸囬拡錛岀敤浜庢寚鍚戞棤鍙傛暟錛屾棤榪斿洖鍊肩殑鍑芥暟銆?/P>
銆銆fp2 涔熸槸涓涓嚱鏁版寚閽堬紝鐢ㄤ簬鎸囧悜鏈変竴涓暣鍨嬪弬鏁幫紝鏃犺繑鍥炲肩殑鍑芥暟銆?BR>銆銆褰撶劧錛屾湁緇忛獙浜哄+涓鑸兘浼氬緩璁嬌鐢╰ypedef鏉ュ畾涔夊嚱鏁版寚閽堢殑綾誨瀷錛屽錛?/P>
銆銆鍑芥暟鎸囬拡涔嬫墍浠ヨ鍒濆鑰呯晱鎯э紝鏈涓昏鐨勫師鍥犳槸瀹冪殑鎷彿澶浜嗭紱鏌愪簺鐢ㄩ旂殑鍑芥暟鎸囬拡錛屽線寰浼氳浜洪櫡鍦ㄦ嫭鍙峰爢涓嚭涓嶆潵錛岃繖閲屽氨涓嶄婦渚嬩簡錛屽洜涓轟笉鏄湰鏂囪璁虹殑鑼冨洿錛泃ypedef 鏂規(guī)硶鍙互鏈夋晥鐨勫噺灝戞嫭鍙風殑鏁伴噺錛屼互鍙婄悊娓呭眰嬈★紝鎵浠ュ彈鍒版帹鑽愩傛湰鏂囨殏鏃跺彧鑰冭檻綆鍗曠殑鍑芥暟鎸囬拡錛屽洜姝ゆ殏涓嶇敤鍒皌ypedef銆?BR>
銆銆鍋囧鏈夊涓嬩袱涓嚱鏁幫細
銆銆鐜板湪闇瑕侀氳繃鍑芥暟鎸囬拡鏉ヨ皟鐢紝鎴戜滑闇瑕佺粰鎸囬拡鎸囧畾鍑芥暟錛?/P>
銆銆瀵逛簬姝や袱縐嶈皟鐢ㄦ柟娉曪紝鏁堟灉瀹屽叏涓鏍鳳紝鎴戞帹鑽愮敤鍓嶄竴縐嶃傚悗涓縐嶄笉浠呬粎鏄鎵撲簡閿洏錛岃屼笖涔熸崯澶變簡涓浜涚伒媧繪с傝繖閲屾殏涓斾笉璇村畠銆?BR>
銆銆C++寮鴻皟綾誨瀷瀹夊叏銆備篃灝辨槸璇達紝涓嶅悓綾誨瀷鐨勫彉閲忔槸涓嶈兘鐩存帴璧嬪肩殑錛屽惁鍒欒交鍒欒鍛婏紝閲嶅垯鎶ラ敊銆傝繖鏄竴涓緢鏈夌敤鐨勭壒鎬э紝甯稿父鑳藉府鎴戜滑鎵懼埌闂銆傚洜姝わ紝鏈夎瘑涔嬪+璁や負錛孋++涓殑浠諱綍涓澶栬鍛婇兘涓嶈兘蹇借銆傜敋鑷蟲湁浜烘彁鍑猴紝緙栬瘧鐨勬椂鍊欎笉鑳藉嚭鐜頒換浣曡鍛婁俊鎭紝涔熷氨鏄錛岃鍛婂簲璇ュ綋浣滈敊璇竴鏍峰鐞嗐?BR>
銆銆姣斿錛屾垜浠妸f1璧嬪肩粰fp2錛岄偅涔圕++緙栬瘧鍣?vc7.1)灝變細鎶ラ敊錛?/P>
銆銆榪欐牱錛岀紪璇戝櫒鍙互甯垜浠壘鍑虹紪鐮佷笂鐨勯敊璇紝鑺傜渷浜嗘垜浠殑鎺掗敊鏃墮棿銆?BR>
銆銆鑰冭檻涓涓婥++鏍囧噯妯℃澘搴撶殑sort鍑芥暟錛?/P>
銆銆姣斿錛屾垜浠湁涓涓暣鍨嬫暟緇勶細
銆銆瑕佸瀹冭繘琛屽崌搴忔帓搴忥紝鎴戜滑闇瀹氫箟涓涓瘮杈冨嚱鏁幫細
銆銆鐒跺悗鐢細
銆銆瑕佹槸鎯沖瀹冭繘琛岄檷搴忔帓搴忥紝鎴戜滑鍙鎹竴涓瘮杈冨嚱鏁板氨鍙互浜嗐侰/C++鐨勬爣鍑嗘ā鏉垮凡緇忔彁渚涗簡less鍜実reat鍑芥暟錛屽洜姝ゆ垜浠彲浠ョ洿鎺ョ敤涓嬮潰鐨勮鍙ユ潵姣旇緝錛?nbsp;
銆銆榪欐牱錛屼笉闇瑕佹敼鍙榮ort鍑芥暟鐨勫畾涔夛紝灝卞彲浠ユ寜浠繪剰鏂規(guī)硶榪涜鎺掑簭錛屾槸涓嶆槸寰堢伒媧伙紵
銆銆榪欑鐢ㄦ硶浠++鐨勬爣鍑嗘ā鏉垮簱(STL)涓潪甯告祦琛屻傚彟澶栵紝鎿嶄綔緋葷粺涓篃緇忓父浣跨敤鍥炶皟(CallBack)鍑芥暟錛屽疄闄呬笂錛屾墍璋撳洖璋冨嚱鏁幫紝鏈川灝辨槸鍑芥暟鎸囬拡銆?/P>
銆銆鐪嬭搗鏉ュ緢綆鍗曞惂錛岃繖鏄渶鏅氱殑C璇█鎸囬拡鐨勭敤娉曘傛湰鏉ヨ繖鏄竴涓緢緹庡鐨勪簨鎯咃紝浣嗘槸褰揅++鏉ヤ復鏃訛紝涓栫晫灝卞紑濮嬪彉浜嗘牱銆?BR>銆銆鍋囧錛岀敤鏉ヨ繘琛宻ort鐨勬瘮杈冨嚱鏁版槸鏌愪釜綾葷殑鎴愬憳錛岄偅鍙堝浣曞憿錛?BR>
鏁版嵁鎸囬拡 | T * |
鎴愬憳鏁版嵁鎸囬拡 | T::* |
鍑芥暟鎸囬拡 | R (*)(...) |
鎴愬憳鍑芥暟鎸囬拡 | R (T::*)(...) |
銆銆榪欐牱涓鏉ワ紝C++鐨勬寚閽堝氨鍙樺緱寰堝按灝細鎴戜滑闇瑕佷竴縐嶆寚閽堣兘澶熸寚鍚戝悓涓綾誨瀷鐨勬暟鎹紝涓嶇榪欎釜鏁版嵁鏄櫘閫氭暟鎹紝榪樻槸鎴愬憳鏁版嵁錛涙垜浠洿闇瑕佷竴縐嶆寚閽堣兘澶熸寚鍚戝悓涓綾誨瀷鐨勫嚱鏁幫紝涓嶇榪欎釜鍑芥暟鏄潤鎬佸嚱鏁幫紝榪樻槸鎴愬憳鍑芥暟銆備絾鏄病鏈夛紝鑷沖皯浠庣幇鍦ㄧ殑C++鏍囧噯涓紝榪樻病鏈夌湅鍒般?BR>銆
娌愭灚緗戝織 C++鎸囬拡鎺㈣(涓?鎴愬憳鍑芥暟鎸囬拡
銆銆鑷粠鏈変簡綾伙紝鎴戜滑寮濮嬫寜鐓с鏁版嵁錛嬫搷浣溿鐨勬柟寮忔潵緇勭粐鏁版嵁緇撴瀯錛涜嚜浠庢湁浜嗘ā鏉匡紝鎴戜滑鍙堝紑濮嬫妸 鏁版嵁 鍜?綆楁硶 鍒嗙錛屼互渚塊噸鐢紝瀹炲湪澶熸姌鑵句漢鐨勩備絾涓嶇鎬庝箞鎶樿吘錛岀幇鍦ㄥぇ澶氭暟鍑芥暟閮戒笉鍐嶅崟韜紝閮藉珌緇欎簡綾伙紝榪涗簡鍥村煄銆傚彲鏄垜浠粛鐒墮渶瑕佽兘澶熻嚜鐢辮皟鐢ㄨ繖浜涙垚鍛樺嚱鏁般?BR>銆銆鑰冭檻涓涓媤indows涓嬬殑瀹氭椂璋冪敤銆係etTimer鍑芥暟鐨勫師鍨嬫槸榪欐牱鐨勶細
銆銆浣嗘槸鏄劇劧錛孋++紼嬪簭鍛樿偗瀹氫笉浼氬洜姝よ屾弧瓚熾傝繖閲屽ご鏈夎澶氳C++鎵瑰垽鐨勪笉瀹夊畾鍥犵礌銆傚畠浣跨敤浜咰++涓璁や負涓嶅畨鍏ㄧ殑綾誨瀷杞崲錛屼笉瀹夊叏鐨剉oid*鎸囬拡錛岀瓑絳夌瓑絳夈備絾榪欐槸緋葷粺涓篊璇█鐣欎笅鐨勮皟鐢ㄦ帴鍙o紝榪欎篃灝辮浜嗐傞偅涔堝亣濡傦紝鎴戜滑灝卞湪C++紼嬪簭涓浣曟潵璋冪敤鎴愬憳鍑芥暟鎸囬拡鍛紵
銆銆濡備笅渚嬶紝鎴戜滑鎵撶畻瀵箆ector涓殑鎵鏈夌被璋冪敤鍏舵寚瀹氱殑鎴愬憳鍑芥暟錛?/P>
銆銆鏂規(guī)硶1錛岀紪璇戜笉鑳介氳繃銆俧or_each鍙厑璁稿叿鏈変竴涓弬鏁扮殑鍑芥暟鎸囬拡鎴栧嚱鏁板璞★紝鍝旳::doit榛樿鏈変竴涓猼his鎸囬拡鍙傛暟涔熶笉琛屻備笉鏄痜or_each娌¤冭檻鍒拌繖涓鐐癸紝鑰屾槸鏍規(guī)湰鍋氫笉鍒幫紒
銆銆鏂規(guī)硶2錛屾樉鐒舵槸鍙楀埌浜哹eginthread鐨勫惎鍙戯紝浣跨敤涓涓潤鎬佸嚱鏁版潵杞皟鐢紝鍝堝搱鎴愬姛浜嗐備絾鏄笉鐖斤紒榪欎笉鏄疌++銆?BR>銆銆鏂規(guī)硶3錛屽懠錛屽ソ涓嶅鏄撳晩錛岀粓浜庣敤mem_fun_ref鍖呰鎴愬姛浜嗘垚鍛樺嚱鏁版寚閽堛?BR>銆銆浼間箮鏂規(guī)硶3涓嶉敊錛屽張鏄被鍨嬪畨鍏ㄧ殑錛屽張鍙互閫氱敤錛嶏紞鎱㈢潃錛岄鍏堬紝瀹冨緢涓戯紝鍝湁璋冪敤鏅欳鍑芥暟鎸囬拡閭d箞婕備寒鍟婏紙瑙佹柟娉?錛夛紝鐢ㄤ簡涓澶т覆鍖呰錛屽張鏄皷鎷彿鍙堟槸鍦嗘嫭鍙鳳紝榪樺皯涓嶄簡&鍙鳳紒鍏舵錛屽畠鍙兘鍖呰涓嶈秴榪囦竴涓弬鏁扮殑鍑芥暟錛佸敖綆″畠鍦╢or_each涓鐢ㄤ簡錛屼絾鏄綘瑕佹槸鎯崇敤鍦ㄨ秴榪囦竴涓弬鏁扮殑鍦哄悎錛岄偅鍙湁涓鍙ヨ瘽錛氫笉鍙兘鐨勪換鍔°?BR>
銆銆鏄殑錛屽湪鏍囧噯C++涓紝榪欐槸涓嶅彲鑳界殑浠誨姟銆備絾浜嬫儏騫朵笉鎬繪槸鎮(zhèn)茶鐨勶紝鑷沖皯鏈夎澶氱涓夋柟搴撴彁渚涗簡瓚呰秺mem_fun鐨勫寘瑁呫傚boost::function絳夌瓑銆備絾鏄畠涔熸湁闄愬埗錛氬畠鎵鏀寔鐨勫弬鏁頒粛鐒舵槸鏈夐檺鐨勶紝鍙湁鍗佸涓紝灝界澶熶綘鐢ㄧ殑浜嗭紱鍚屾牱錛屽畠涔熸槸涓戦檵鐨勶紝姘歌繙涓嶈鎯沖畠鑳藉綆鍗曠殑鐢?amp;鏉ユ悶瀹氥?BR>
銆銆涔熻錛屼互澶卞幓緹庝附鐨勪唬浠鳳紝鏉ユ崲鍙栬川閲忎笂鐨勪繚璇侊紝榪欎篃鏄疌++瀵逛簬鍑芥暟鎸囬拡鐨勪竴縐嶆棤濂堝惂鈥︹?BR>
銆銆鏈熷緟C++0x鐗堟湰銆傚畠閫氳繃鍙彉妯℃澘鍙傛暟錛岃兘澶熻mem_fun鐨勫弬鏁拌揪鍒版棤闄愪釜鈥︹?BR>
錛嶏紞錛嶏紞錛嶏紞錛嶏紞
BTW: C++Builder鎵╁睍浜嗕竴涓叧閿瓧 closure 錛屽厑璁告垚鍛樺嚱鏁版寚閽堝鍚屾櫘閫氬嚱鏁版寚閽堜竴鏍蜂嬌鐢ㄣ備篃璁窩++0x鑳借冭檻涓涓嬧︹?/P>
鎸夌収闈㈠悜榪囩▼鐨勫熀鏈師鍒欙紝鍒掑垎緋葷粺鍔熻兘妯″潡銆佹ā鍧楃粏鍒嗗埌鍑芥暟銆佺敓鎴愮郴緇熸暣浣撶殑緇撴瀯妯″瀷錛屼技涔庡湪鏁翠釜榪囩▼涓病鏈変換浣曚笢瑗垮彲浠ョ敤鏉ユ彁渚涚郴緇熸墿灞曪紝鍏跺疄瑙e喅鐨勬柟娉曡繕鏄湁鐨勶紝榪欐牴鏁戝懡紼昏崏灝辨槸鍥炶皟鏈哄埗銆?/P>
涓璋堝埌鍥炶皟鏈哄埗錛屽綋鐒跺氨灝戜笉浜嗘垜浠殑涓昏錛氱郴緇烝PI(閫氬父閮芥槸)鍜屽洖璋冨嚱鏁幫紝榪欎袱鑰呯己涓涓嶅彲銆傚叾瀹炲洖璋冪殑鍩烘湰鎬濇兂灝辨槸鐢辯郴緇熺粰鎴戜滑鎻愪緵涓浜涙帴鍙o紝涔熷氨鏄父浣跨敤鐨凙PI錛岃繖縐嶅嚱鏁板彲浠ュ皢鏌愪釜鍏朵粬鍑芥暟鐨勫湴鍧浣滀負鍏跺弬鏁頒箣涓錛岃屼笖鍙互鍒╃敤璇ュ湴鍧瀵硅繖涓嚱鏁拌繘琛岃皟鐢紝鑰岃璋冪敤鐨勫嚱鏁板氨鏄垜浠氬父鎵璇寸殑鍥炶皟鍑芥暟浜嗐?BR>涓嬮潰緇欎釜鍥炶皟鍑芥暟浣跨敤鐨勫皬渚嬪瓙錛?BR>錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞
//鐩稿綋浜庢垜浠彁鍒扮殑緋葷粺API
mainFunc( void* userFunc )//褰撶劧鍙傛暟涓嶄細榪欎箞綆鍗曪紝鍙槸妯℃嫙
{
while (...)
{
printf("ok!");
//璋冪敤鍥炶皟鍑芥暟浜?BR> if (userFunc!=NULL)
userFunc();
}
}
鍙互鐪嬪嚭MainFunc鍙互鏍規(guī)嵁鍑芥暟userFunc鐨勫湴鍧璋冪敤瀹冦?BR>錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞
榪欐牱浣跨敤鑰呭彧闇瑕佸畾涔変竴涓嚱鏁幫細void myFunc()錛岀劧鍚庢寜鐓ainFunc(&myFunc)(&鍙〃紺轟紶閫掔殑鏄嚱鏁扮殑鍦板潃錛屾棤鍏蜂綋鍚箟)錛屽氨鍙互璁╂垜浠殑mainFunc鏉ヨ皟鐢╩yFunc浠庤屽疄鐜扮浉搴旂殑鍔熻兘錛岃繖鏍峰綋鐒跺彲浠ュ畬鎴愭垜浠鏈熺殑鐩殑錛嶆墿灞曠幇鏈夌郴緇熴?/P>
鍦╳indows緋葷粺涓紝鏀寔榪欑鍥炶皟鏈哄埗鐨勭郴緇烝PI涓嶅崰灝戞暟錛屽儚瀹炵幇ListControl鎺掑簭鐨凷ortItem()鍑芥暟錛岃繕鏈夋搷浣淔ont浣跨敤鐨勫嚱鏁癊numFontFamilies()閮芥湁鎻愪緵榪欑鍥炶皟鏈哄埗錛屼嬌寰楁垜浠殑鐢ㄦ埛鏈夋満浼氭坊鍔犺嚜宸辨湡鏈涚殑鍔熻兘瀹炵幇銆傚綋鐒訛紝浣跨敤鍥炶皟鍑芥暟騫朵笉鏄竴涓交鏉劇殑浜嬫儏錛屽鏋滄垜浠殑緋葷粺涓瓨鍦ㄤ簡澶ч噺鐨勫洖璋冨嚱鏁版槸寰堥毦綆$悊鐨勶紝榪欎釜灝變笌緋葷粺涓瓨鍦ㄥぇ閲忓叏灞鍙橀噺涓鏍鳳紝鍑虹幇澶氫釜鍑芥暟浜夌浉璁塊棶鍚屼竴涓彉閲忔垜浠氨寰堥毦浣跨敤綆鍗曠殑閫昏緫鏉ュ鐞嗭紝瀹規(guī)槗闄峰叆娣蜂貢錛屽洜姝わ紝灝界鍥炶皟鏈哄埗鍙互鍦ㄦ煇縐嶇▼搴︿笂杈懼埌鎴戜滑鐨勭洰鐨勶紝浣嗗垏涓嶅彲涔卞姞浣跨敤錛屼笉鐒跺悗鏋滃緢闅鵑鏂欍?/P>
褰撶劧鑷充簬璇︾粏鐨勫洖璋冨嚱鏁板疄鐜幫紝榪橀渶瑕佸ぇ瀹舵綔蹇冪爺絀訛紝榪欓噷鎴戝彧鏄葷粨涓涓嬶細
1 鍥炶皟鍑芥暟鏄敱寮鍙戣呮寜鐓т竴瀹氱殑鍘熷瀷榪涜瀹氫箟鐨勫嚱鏁?姣忎釜鍥炶皟鍑芥暟閮藉繀欏婚伒寰繖涓師鍨嬫潵璁捐)
渚嬪錛?BR>錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞
BOOL CALLBACK DialogProc(
HWND hwndDlg, // handle of dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞
璇存槑錛?BR>鍥炶皟鍑芥暟蹇呴』鏈夊叧閿瘝 CALLBACK
鍥炶皟鍑芥暟鏈韓蹇呴』鏄叏灞鍑芥暟鎴栬呴潤鎬佸嚱鏁幫紝涓嶅彲瀹氫箟涓烘煇涓壒瀹氱殑綾葷殑鎴愬憳鍑芥暟
2 鍥炶皟鍑芥暟騫朵笉鐢卞紑鍙戣呯洿鎺ヨ皟鐢ㄦ墽琛?鍙槸浣跨敤緋葷粺鎺ュ彛API鍑芥暟浣滀負璧風偣)
3 鍥炶皟鍑芥暟閫氬父浣滀負鍙傛暟浼犻掔粰緋葷粺API錛岀敱璇PI鏉ヨ皟鐢?BR>4 鍥炶皟鍑芥暟鍙兘琚郴緇烝PI璋冪敤涓嬈★紝涔熷彲鑳借寰幆璋冪敤澶氭(SortItem灝辨槸鑷皟鐢?
鏈鍚庤鍙ラ澶栬瘽錛屽叾瀹瀢indows緋葷粺涓繕鏈夊彟涓縐嶆満鍒訛紞娑堟伅鏈哄埗錛屼篃鏄竴涓瘮杈冧笉閿欑殑宸ュ叿錛岃兘澶熶負寰堝瀹為檯鐨勯棶棰樻彁渚涜В鍐蟲柟娉曪紝榪欎釜浠ュ悗鍐嶆葷粨浜嗐?/P>
闇瑕佷竴涓暟鎹璞′負鏁翠釜綾昏岄潪鏌愪釜瀵硅薄鏈嶅姟,鍚屾椂鍙堝姏姹備笉鐮村潖綾葷殑灝佽鎬?鍗寵姹傛鎴愬憳闅愯棌鍦ㄧ被鐨勫唴閮紝瀵瑰涓嶅彲瑙併?/P>
static鐨勫唴閮ㄦ満鍒訛細
闈欐佹暟鎹垚鍛樿鍦ㄧ▼搴忎竴寮濮嬭繍琛屾椂灝卞繀欏誨瓨鍦ㄣ傚洜涓哄嚱鏁板湪紼嬪簭榪愯涓璋冪敤錛屾墍浠ラ潤鎬佹暟鎹垚鍛樹笉鑳藉湪浠諱綍鍑芥暟鍐呭垎閰嶇┖闂村拰鍒濆鍖栥?BR> 榪欐牱錛屽畠鐨勭┖闂村垎閰嶆湁涓変釜鍙兘鐨勫湴鏂癸紝涓鏄綔涓虹被鐨勫閮ㄦ帴鍙g殑澶存枃浠訛紝閭i噷鏈夌被澹版槑錛涗簩鏄被瀹氫箟鐨勫唴閮ㄥ疄鐜幫紝閭i噷鏈夌被鐨勬垚鍛樺嚱鏁板畾涔夛紱涓夋槸搴旂敤紼嬪簭鐨刴ain錛堬級鍑芥暟鍓嶇殑鍏ㄥ眬鏁版嵁澹版槑鍜屽畾涔夊銆?BR> 闈欐佹暟鎹垚鍛樿瀹為檯鍦板垎閰嶇┖闂達紝鏁呬笉鑳藉湪綾葷殑澹版槑涓畾涔夛紙鍙兘澹版槑鏁版嵁鎴愬憳錛夈傜被澹版槑鍙0鏄庝竴涓被鐨勨滃昂瀵稿拰瑙勬牸鈥濓紝騫朵笉榪涜瀹為檯鐨勫唴瀛樺垎閰嶏紝鎵浠ュ湪綾誨0鏄庝腑鍐欐垚瀹氫箟鏄敊璇殑銆傚畠涔熶笉鑳藉湪澶存枃浠朵腑綾誨0鏄庣殑澶栭儴瀹氫箟錛屽洜涓洪偅浼氶犳垚鍦ㄥ涓嬌鐢ㄨ綾葷殑婧愭枃浠朵腑錛屽鍏墮噸澶嶅畾涔夈?BR> static琚紩鍏ヤ互鍛婄煡緙栬瘧鍣紝灝嗗彉閲忓瓨鍌ㄥ湪紼嬪簭鐨勯潤鎬佸瓨鍌ㄥ尯鑰岄潪鏍堜笂絀洪棿錛岄潤鎬?BR>鏁版嵁鎴愬憳鎸夊畾涔夊嚭鐜扮殑鍏堝悗欏哄簭渚濇鍒濆鍖栵紝娉ㄦ剰闈欐佹垚鍛樺祵濂楁椂錛岃淇濊瘉鎵宓屽鐨勬垚鍛樺凡緇忓垵濮嬪寲浜嗐傛秷闄ゆ椂鐨勯『搴忔槸鍒濆鍖栫殑鍙嶉『搴忋?/P>
static鐨勪紭鍔匡細
鍙互鑺傜渷鍐呭瓨錛屽洜涓哄畠鏄墍鏈夊璞℃墍鍏湁鐨勶紝鍥犳錛屽澶氫釜瀵硅薄鏉ヨ錛岄潤鎬佹暟鎹垚鍛樺彧瀛樺偍涓澶勶紝渚涙墍鏈夊璞″叡鐢ㄣ傞潤鎬佹暟鎹垚鍛樼殑鍊煎姣忎釜瀵硅薄閮芥槸涓鏍鳳紝浣嗗畠鐨勫兼槸鍙互鏇存柊鐨勩傚彧瑕佸闈欐佹暟鎹垚鍛樼殑鍊兼洿鏂頒竴嬈★紝淇濊瘉鎵鏈夊璞″瓨鍙栨洿鏂板悗鐨勭浉鍚岀殑鍊鹼紝榪欐牱鍙互鎻愰珮鏃墮棿鏁堢巼銆?/P>
寮曠敤闈欐佹暟鎹垚鍛樻椂錛岄噰鐢ㄥ涓嬫牸寮忥細
<綾誨悕>::<闈欐佹垚鍛樺悕>
濡傛灉闈欐佹暟鎹垚鍛樼殑璁塊棶鏉冮檺鍏佽鐨勮瘽(鍗硃ublic鐨勬垚鍛?錛屽彲鍦ㄧ▼搴忎腑錛屾寜涓婅堪鏍煎紡
鏉ュ紩鐢ㄩ潤鎬佹暟鎹垚鍛樸?/P>
PS:
(1)綾葷殑闈欐佹垚鍛樺嚱鏁版槸灞炰簬鏁翠釜綾昏岄潪綾葷殑瀵硅薄錛屾墍浠ュ畠娌℃湁this鎸囬拡錛岃繖灝卞鑷?BR>浜嗗畠浠呰兘璁塊棶綾葷殑闈欐佹暟鎹拰闈欐佹垚鍛樺嚱鏁般?BR> (2)涓嶈兘灝嗛潤鎬佹垚鍛樺嚱鏁板畾涔変負铏氬嚱鏁般?BR> (3)鐢變簬闈欐佹垚鍛樺0鏄庝簬綾諱腑錛屾搷浣滀簬鍏跺錛屾墍浠ュ鍏跺彇鍦板潃鎿嶄綔錛屽氨澶氬皯鏈変簺鐗規(guī)畩
錛屽彉閲忓湴鍧鏄寚鍚戝叾鏁版嵁綾誨瀷鐨勬寚閽?錛屽嚱鏁板湴鍧綾誨瀷鏄竴涓渘onmember鍑芥暟鎸囬拡鈥濄?/P>
(4)鐢變簬闈欐佹垚鍛樺嚱鏁版病鏈塼his鎸囬拡錛屾墍浠ュ氨宸笉澶氱瓑鍚屼簬nonmember鍑芥暟錛岀粨鏋滃氨
浜х敓浜嗕竴涓剰鎯充笉鍒扮殑濂藉錛氭垚涓轟竴涓猚allback鍑芥暟錛屼嬌寰楁垜浠緱浠ュ皢C++鍜孋-based X W
indow緋葷粺緇撳悎錛屽悓鏃朵篃鎴愬姛鐨勫簲鐢ㄤ簬綰跨▼鍑芥暟韜笂銆?BR> (5)static騫舵病鏈夊鍔犵▼搴忕殑鏃剁┖寮閿錛岀浉鍙嶅ス榪樼緝鐭簡瀛愮被瀵圭埗綾婚潤鎬佹垚鍛樼殑璁塊棶
鏃墮棿錛岃妭鐪佷簡瀛愮被鐨勫唴瀛樼┖闂淬?BR> (6)闈欐佹暟鎹垚鍛樺湪<瀹氫箟鎴栬鏄?gt;鏃跺墠闈㈠姞鍏抽敭瀛梥tatic銆?BR> (7)闈欐佹暟鎹垚鍛樻槸闈欐佸瓨鍌ㄧ殑錛屾墍浠ュ繀欏誨瀹冭繘琛屽垵濮嬪寲銆?BR> (8)闈欐佹垚鍛樺垵濮嬪寲涓庝竴鑸暟鎹垚鍛樺垵濮嬪寲涓嶅悓:
鍒濆鍖栧湪綾諱綋澶栬繘琛岋紝鑰屽墠闈笉鍔爏tatic錛屼互鍏嶄笌涓鑸潤鎬佸彉閲忔垨瀵硅薄鐩告販娣嗭紱
鍒濆鍖栨椂涓嶅姞璇ユ垚鍛樼殑璁塊棶鏉冮檺鎺у埗絎rivate錛宲ublic絳夛紱
鍒濆鍖栨椂浣跨敤浣滅敤鍩熻繍綆楃鏉ユ爣鏄庡畠鎵灞炵被錛?BR> 鎵浠ユ垜浠緱鍑洪潤鎬佹暟鎹垚鍛樺垵濮嬪寲鐨勬牸寮忥細
<鏁版嵁綾誨瀷><綾誨悕>::<闈欐佹暟鎹垚鍛樺悕>=<鍊?gt;
(9)涓轟簡闃叉鐖剁被鐨勫獎鍝嶏紝鍙互鍦ㄥ瓙綾誨畾涔変竴涓笌鐖剁被鐩稿悓鐨勯潤鎬佸彉閲忥紝浠ュ睆钄界埗綾葷殑褰卞搷銆傝繖閲屾湁涓鐐歸渶瑕佹敞鎰忥細鎴戜滑璇撮潤鎬佹垚鍛樹負鐖剁被鍜屽瓙綾誨叡浜紝浣嗘垜浠湁閲嶅瀹氫箟浜嗛潤鎬佹垚鍛橈紝榪欎細涓嶄細寮曡搗閿欒鍛紵涓嶄細錛屾垜浠殑緙栬瘧鍣ㄩ噰鐢ㄤ簡涓縐嶇粷濡欑殑鎵嬫硶錛歯ame-mangling 鐢ㄤ互鐢熸垚鍞竴鐨勬爣蹇椼?BR>
錛堟劅璋㈣タ瀹夎蔣浠跺洯鐨勭帇鍏堢敓涓烘垜鎸囧嚭閿欒錛屾劅璋㈢綉鍙媌acker甯姪鎴戞壘鍑烘紜殑絳旀銆傦級
鍦ㄥ厜鐩榁C02涓紝鍦ㄤ粙緇嶆瀯閫犲嚱鏁版椂錛屾垜璇達細鈥滄瀯閫犲嚱鏁版渶閲嶈鐨勪綔鐢ㄦ槸鍒涘緩瀵硅薄鏈韓錛屽璞″唴瀛樼殑鍒嗛厤鐢辨瀯閫犲嚱鏁版潵瀹屾垚鐨勨濓紝榪欏彞璇濇槸閿欑殑錛屽璞″唴瀛樼殑鍒嗛厤鍜屾瀯閫犲嚱鏁版病鏈夊叧緋伙紝瀵硅薄鍐呭瓨鐨勫垎閰嶆槸鐢辯紪璇戝櫒鏉ュ畬鎴愮殑錛屾瀯閫犲嚱鏁扮殑浣滅敤鏄瀵硅薄鏈韓鍋氬垵濮嬪寲宸ヤ綔錛屼篃灝辨槸緇欑敤鎴鋒彁渚涘垵濮嬪寲綾諱腑鎴愬憳鍙橀噺鐨勪竴縐嶆柟寮忥紝鍦ㄧ被瀵硅薄鏈夎櫄琛ㄧ殑鎯呭喌涓嬶紝鏋勯犲嚱鏁拌繕瀵硅櫄琛ㄨ繘琛屽垵濮嬪寲銆?/P>
鍙﹀錛屾垜璇達細鈥淐++鍙堣瀹氾紝濡傛灉涓涓被娌℃湁鎻愪緵浠諱綍鐨勬瀯閫犲嚱鏁幫紝鍒機++鎻愪緵涓涓粯璁ょ殑鏋勯犲嚱鏁幫紙鐢盋++緙栬瘧鍣ㄦ彁渚涳級鈥濓紝榪欏彞璇濅篃鏄敊璇殑錛屾紜殑鏄細
濡傛灉涓涓被涓病鏈夊畾涔変換浣曠殑鏋勯犲嚱鏁幫紝閭d箞緙栬瘧鍣ㄥ彧鏈夊湪浠ヤ笅涓夌鎯呭喌錛屾墠浼氭彁渚涢粯璁ょ殑鏋勯犲嚱鏁幫細
1銆佸鏋滅被鏈夎櫄鎷熸垚鍛樺嚱鏁版垨鑰呰櫄鎷熺戶鎵跨埗綾伙紙鍗蟲湁铏氭嫙鍩虹被錛夋椂錛?BR>2銆佸鏋滅被鐨勫熀綾繪湁鏋勯犲嚱鏁幫紙鍙互鏄敤鎴峰畾涔夌殑鏋勯犲嚱鏁幫紝鎴栫紪璇戝櫒鎻愪緵鐨勯粯璁ゆ瀯閫犲嚱鏁幫級錛?BR>3銆佸湪綾諱腑鐨勬墍鏈夐潪闈欐佺殑瀵硅薄鏁版嵁鎴愬憳錛屽畠浠搴旂殑綾諱腑鏈夋瀯閫犲嚱鏁幫紙鍙互鏄敤鎴峰畾涔夌殑鏋勯犲嚱鏁幫紝鎴栫紪璇戝櫒鎻愪緵鐨勯粯璁ゆ瀯閫犲嚱鏁幫級銆?/P>
鈥曗曞嵆VC++瑙嗛絎笁璇総his鎸囬拡璇︾粏璇存槑
浣滆咃細瀛欓懌 鏃墮棿錛??xml:namespace prefix = st1 />
瑕佹洿濂藉湴鐞嗚ВC++鐨勫鎬佹э紝鎴戜滑闇瑕佸紕娓呮鍑芥暟瑕嗙洊鐨勮皟鐢ㄦ満鍒訛紝鍥犳錛岄鍏堟垜浠粙緇嶄竴涓嬪嚱鏁扮殑瑕嗙洊銆?/P>
鎴戜滑鍏堢湅涓涓緥瀛愶細 渚?FONT face=Arial>1- 1 #include <iostream.h> class animal { public: void sleep() { cout<<"animal sleep"<<endl; } void breathe()
{
cout<<"animal breathe"<<endl;
}
}; class fish:public animal { public: void breathe()
{
cout<<"fish bubble"<<endl;
}
}; void main() { fish fh;
animal *pAn=&fh;
pAn->breathe();
} 娉ㄦ剰錛屽湪渚?-1鐨勭▼搴忎腑娌℃湁瀹氫箟铏氬嚱鏁般傝冭檻涓涓嬩緥1-1鐨勭▼搴忔墽琛岀殑緇撴灉鏄粈涔堬紵 絳旀鏄緭鍑猴細animal breathe 鍦ㄧ被fish涓噸鍐欎簡breathe()鍑芥暟錛屾垜浠彲浠ョО涓哄嚱鏁扮殑瑕嗙洊銆傚湪main()鍑芥暟涓鍏堝畾涔変簡涓涓猣ish瀵硅薄fh錛屾帴鐫瀹氫箟浜嗕竴涓寚鍚慳nimal鐨勬寚閽堝彉閲弍An錛屽皢fh鐨勫湴鍧璧嬬粰浜嗘寚閽堝彉閲弍An錛岀劧鍚庡埄鐢ㄨ鍙橀噺璋冪敤pAn->breathe()銆傝澶氬鍛樺線寰灝嗚繖縐嶆儏鍐靛拰C++鐨勫鎬佹ф悶娣鋒穯錛岃涓篺h瀹為檯涓婃槸fish綾葷殑瀵硅薄錛屽簲璇ユ槸璋冪敤fish綾葷殑breathe()錛岃緭鍑衡渇ish bubble鈥濓紝鐒跺悗緇撴灉鍗翠笉鏄繖鏍楓備笅闈㈡垜浠粠涓や釜鏂歸潰鏉ヨ榪板師鍥犮?/P>
1銆?nbsp; 緙栬瘧鐨勮搴?/P>
C++緙栬瘧鍣ㄥ湪緙栬瘧鐨勬椂鍊欙紝瑕佺‘瀹氭瘡涓璞¤皟鐢ㄧ殑鍑芥暟鐨勫湴鍧錛岃繖縐頒負鏃╂湡緇戝畾錛坋arly binding錛夛紝褰撴垜浠皢fish綾葷殑瀵硅薄fh鐨勫湴鍧璧嬬粰pAn鏃訛紝C++緙栬瘧鍣ㄨ繘琛屼簡綾誨瀷杞崲錛屾鏃禖++緙栬瘧鍣ㄨ涓哄彉閲弍An淇濆瓨灝辨槸animal瀵硅薄鐨勫湴鍧銆傚綋鍦╩ain()鍑芥暟涓墽琛宲An->breathe()鏃訛紝璋冪敤鐨勫綋鐒跺氨鏄痑nimal瀵硅薄鐨刡reathe鍑芥暟銆?/P>
2銆?nbsp; 鍐呭瓨妯″瀷鐨勮搴?/P>
鎴戜滑緇欏嚭浜唂ish瀵硅薄鍐呭瓨妯″瀷錛屽涓嬪浘鎵紺猴細
鍥?- 1 fish綾誨璞$殑鍐呭瓨妯″瀷
鎴戜滑鏋勯?FONT face="Times New Roman">fish 姝e寰堝瀛﹀憳鎵鎯籌紝鍦ㄤ緥1-1鐨勭▼搴忎腑錛屾垜浠煡閬?FONT face="Times New Roman">pAn瀹為檯鎸囧悜鐨勬槸fish綾葷殑瀵硅薄錛屾垜浠笇鏈涜緭鍑虹殑緇撴灉鏄奔鐨勫懠鍚告柟娉曪紝鍗寵皟鐢?FONT face="Times New Roman">fish綾葷殑breathe鏂規(guī)硶銆傝繖涓椂鍊欙紝灝辮杞埌铏氬嚱鏁扮櫥鍦轟簡銆?/P>
鍓嶉潰杈撳嚭鐨勭粨鏋滄槸鍥犱負緙栬瘧鍣ㄥ湪緙栬瘧鐨勬椂鍊欙紝灝卞凡緇忕‘瀹氫簡瀵硅薄璋冪敤鐨勫嚱鏁扮殑鍦板潃錛岃瑙e喅榪欎釜闂灝辮浣跨敤榪熺粦瀹氾紙late binding錛夋妧鏈傚綋緙栬瘧鍣ㄤ嬌鐢ㄨ繜緇戝畾鏃訛紝灝變細鍦ㄨ繍琛屾椂鍐嶅幓紜畾瀵硅薄鐨勭被鍨嬩互鍙婃紜殑璋冪敤鍑芥暟銆傝岃璁╃紪璇戝櫒閲囩敤榪熺粦瀹氾紝灝辮鍦ㄥ熀綾諱腑澹版槑鍑芥暟鏃朵嬌鐢?FONT face="Times New Roman">virtual鍏抽敭瀛楋紙娉ㄦ剰錛岃繖鏄繀欏葷殑錛屽緢澶氬鍛樺氨鏄洜涓烘病鏈変嬌鐢ㄨ櫄鍑芥暟鑰屽啓鍑哄緢澶氶敊璇殑渚嬪瓙錛夛紝榪欐牱鐨勫嚱鏁版垜浠О涓鴻櫄鍑芥暟銆備竴鏃︽煇涓嚱鏁板湪鍩虹被涓0鏄庝負virtual錛岄偅涔堝湪鎵鏈夌殑媧劇敓綾諱腑璇ュ嚱鏁伴兘鏄?FONT face="Times New Roman">virtual錛岃屼笉闇瑕佸啀鏄劇ず鐨勫0鏄庝負virtual銆?/P>
涓嬮潰淇敼渚?FONT face="Times New Roman">1-1鐨勪唬鐮侊紝灝?FONT face="Times New Roman">animal綾諱腑鐨?FONT face="Times New Roman">breathe()鍑芥暟澹版槑涓?FONT face="Times New Roman">virtual錛屽涓嬶細 渚?FONT face=Arial>1- 2 #include <iostream.h> class animal { public: void sleep() { cout<<"animal sleep"<<endl; } virtual void breathe() { cout<<"animal breathe"<<endl; } }; class fish:public animal { public: void breathe() { cout<<"fish bubble"<<endl; } }; void main() { fish fh; animal *pAn=&fh; pAn->breathe(); } 澶у鍙互鍐嶆榪愯榪欎釜紼嬪簭錛屼綘浼氬彂鐜扮粨鏋滄槸鈥?FONT face="Times New Roman">fish bubble鈥濓紝涔熷氨鏄牴鎹璞$殑綾誨瀷璋冪敤浜嗘紜殑鍑芥暟銆?/P>
閭d箞褰撴垜浠皢breathe()澹版槑涓?FONT face="Times New Roman">virtual鏃訛紝鍦ㄨ儗鍚庡彂鐢熶簡浠涔堝憿錛?/P>
緙栬瘧鍣ㄥ湪緙栬瘧鐨勬椂鍊欙紝鍙戠幇animal綾諱腑鏈夎櫄鍑芥暟錛屾鏃剁紪璇戝櫒浼氫負姣忎釜鍖呭惈铏氬嚱鏁扮殑綾誨垱寤轟竴涓櫄琛紙鍗硋table錛夛紝璇ヨ〃鏄竴涓竴緇存暟緇勶紝鍦ㄨ繖涓暟緇勪腑瀛樻斁姣忎釜铏氬嚱鏁扮殑鍦板潃銆傚浜庝緥1-2鐨勭▼搴忥紝animal鍜宖ish綾婚兘鍖呭惈浜嗕竴涓櫄鍑芥暟breathe()錛屽洜姝ょ紪璇戝櫒浼氫負榪欎袱涓被閮藉緩绔嬩竴涓櫄琛紝濡備笅鍥炬墍紺猴細 鍥?- 2 animal綾誨拰fish綾葷殑铏氳〃 閭d箞濡備綍瀹氫綅铏氳〃鍛紵緙栬瘧鍣ㄥ彟澶栬繕涓烘瘡涓被鎻愪緵浜嗕竴涓櫄琛ㄦ寚閽堬紙鍗?FONT face="Times New Roman">vptr錛夛紝榪欎釜鎸囬拡鎸囧悜浜嗗璞$殑铏氳〃銆傚湪紼嬪簭榪愯鏃訛紝鏍規(guī)嵁瀵硅薄鐨勭被鍨嬪幓鍒濆鍖?FONT face="Times New Roman">vptr錛屼粠鑰岃vptr姝g‘鐨勬寚鍚戞墍灞炵被鐨勮櫄琛紝浠庤屽湪璋冪敤铏氬嚱鏁版椂錛屽氨鑳藉鎵懼埌姝g‘鐨勫嚱鏁般傚浜庝緥1-2鐨勭▼搴忥紝鐢變簬pAn瀹為檯鎸囧悜鐨勫璞$被鍨嬫槸fish錛屽洜姝?FONT face="Times New Roman">vptr鎸囧悜鐨?FONT face="Times New Roman">fish綾葷殑vtable錛屽綋璋冪敤pAn->breathe()鏃訛紝鏍規(guī)嵁铏氳〃涓殑鍑芥暟鍦板潃鎵懼埌鐨勫氨鏄?FONT face="Times New Roman">fish綾葷殑breathe()鍑芥暟銆?/FONT> 姝f槸鐢變簬姣忎釜瀵硅薄璋冪敤鐨勮櫄鍑芥暟閮芥槸閫氳繃铏氳〃鎸囬拡鏉ョ儲寮曠殑錛屼篃灝卞喅瀹氫簡铏氳〃鎸囬拡鐨勬紜垵濮嬪寲鏄潪甯擱噸瑕佺殑銆傛崲鍙ヨ瘽璇達紝鍦ㄨ櫄琛ㄦ寚閽堟病鏈夋紜垵濮嬪寲涔嬪墠錛屾垜浠笉鑳藉鍘昏皟鐢ㄨ櫄鍑芥暟銆傞偅涔堣櫄琛ㄦ寚閽堝湪浠涔堟椂鍊欙紝鎴栬呰鍦ㄤ粈涔堝湴鏂瑰垵濮嬪寲鍛紵 絳旀鏄湪鏋勯犲嚱鏁頒腑榪涜铏氳〃鐨勫垱寤哄拰铏氳〃鎸囬拡鐨勫垵濮嬪寲銆傝繕璁板緱鏋勯犲嚱鏁扮殑璋冪敤欏哄簭鍚楋紝鍦ㄦ瀯閫犲瓙綾誨璞℃椂錛岃鍏堣皟鐢ㄧ埗綾葷殑鏋勯犲嚱鏁幫紝姝ゆ椂緙栬瘧鍣ㄥ彧鈥滅湅鍒頒簡鈥濈埗綾伙紝騫朵笉鐭ラ亾鍚庨潰鏄惁鍚庤繕鏈夌戶鎵胯咃紝瀹冨垵濮嬪寲鐖剁被鐨勮櫄琛ㄦ寚閽堬紝璇ヨ櫄琛ㄦ寚閽堟寚鍚戠埗綾葷殑铏氳〃銆傚綋鎵ц瀛愮被鐨勬瀯閫犲嚱鏁版椂錛屽瓙綾葷殑铏氳〃鎸囬拡琚垵濮嬪寲錛屾寚鍚戣嚜韜殑铏氳〃銆傚浜庝緥2-2鐨勭▼搴忔潵璇達紝褰?FONT face="Times New Roman">fish綾葷殑fh瀵硅薄鏋勯犲畬姣曞悗錛屽叾鍐呴儴鐨勮櫄琛ㄦ寚閽堜篃灝辮鍒濆鍖栦負鎸囧悜fish綾葷殑铏氳〃銆傚湪綾誨瀷杞崲鍚庯紝璋冪敤pAn->breathe()錛岀敱浜?FONT face="Times New Roman">pAn瀹為檯鎸囧悜鐨勬槸fish綾葷殑瀵硅薄錛岃瀵硅薄鍐呴儴鐨勮櫄琛ㄦ寚閽堟寚鍚戠殑鏄?FONT face="Times New Roman">fish綾葷殑铏氳〃錛屽洜姝ゆ渶緇堣皟鐢ㄧ殑鏄?FONT face="Times New Roman">fish綾葷殑breathe()鍑芥暟銆?/FONT> 瑕佹敞鎰忥細瀵逛簬铏氬嚱鏁拌皟鐢ㄦ潵璇達紝姣忎竴涓璞″唴閮ㄩ兘鏈変竴涓櫄琛ㄦ寚閽堬紝璇ヨ櫄琛ㄦ寚閽堣鍒濆鍖栦負鏈被鐨勮櫄琛ㄣ傛墍浠ュ湪紼嬪簭涓紝涓嶇浣犵殑瀵硅薄綾誨瀷濡備綍杞崲錛屼絾璇ュ璞″唴閮ㄧ殑铏氳〃鎸囬拡鏄浐瀹氱殑錛屾墍浠ュ憿錛屾墠鑳藉疄鐜板姩鎬佺殑瀵硅薄鍑芥暟璋冪敤錛岃繖灝辨槸C++澶氭佹у疄鐜扮殑鍘熺悊銆?/FONT> 鎬葷粨錛堝熀綾繪湁铏氬嚱鏁幫級錛?/FONT> 1銆?/FONT> 姣忎竴涓被閮芥湁铏氳〃銆?/FONT> 2銆?/FONT> 铏氳〃鍙互緇ф壙錛屽鏋滃瓙綾繪病鏈夐噸鍐欒櫄鍑芥暟錛岄偅涔堝瓙綾昏櫄琛ㄤ腑浠嶇劧浼氭湁璇ュ嚱鏁扮殑鍦板潃錛屽彧涓嶈繃榪欎釜鍦板潃鎸囧悜鐨勬槸鍩虹被鐨勮櫄鍑芥暟瀹炵幇銆傚鏋滃熀綾?FONT face="Times New Roman">3涓櫄鍑芥暟錛岄偅涔堝熀綾葷殑铏氳〃涓氨鏈変笁欏癸紙铏氬嚱鏁板湴鍧錛夛紝媧劇敓綾諱篃浼氭湁铏氳〃錛岃嚦灝戞湁涓夐」錛屽鏋滈噸鍐欎簡鐩稿簲鐨勮櫄鍑芥暟錛岄偅涔堣櫄琛ㄤ腑鐨勫湴鍧灝變細鏀瑰彉錛屾寚鍚戣嚜韜殑铏氬嚱鏁板疄鐜般傚鏋滄淳鐢熺被鏈夎嚜宸辯殑铏氬嚱鏁幫紝閭d箞铏氳〃涓氨浼氭坊鍔犺欏廣?/FONT> 3銆?/FONT> 媧劇敓綾葷殑铏氳〃涓櫄鍑芥暟鍦板潃鐨勬帓鍒楅『搴忓拰鍩虹被鐨勮櫄琛ㄤ腑铏氬嚱鏁板湴鍧鎺掑垪欏哄簭鐩稿悓銆?/FONT> 鎴戝湪璁哄潧鐨?FONT face="Times New Roman">VC鏁欏瑙嗛鐗堥潰鍙戜簡甯栧瓙錛屾槸妯℃嫙MFC綾誨簱鐨勪緥瀛愬啓鐨勶紝涓昏鏄鏄庡湪鍩虹被鐨勬瀯閫犲嚱鏁頒腑淇濆瓨鐨?FONT face="Times New Roman">this鎸囬拡鏄寚鍚戝瓙綾葷殑錛屾垜浠湪鐪嬩竴涓嬭繖涓緥瀛愶細 渚?- 3 #include <iostream.h>
class base;
base * pbase;
class base
{
public:
base()
{
pbase=this;
}
virtual void fn()
{
cout<<"base"<<endl;
}
};
class derived:public base
{
void fn()
{
cout<<"derived"<<endl;
}
};
derived aa;
void main()
{
pbase->fn();
} 鎴戝湪base綾葷殑鏋勯犲嚱鏁頒腑灝?FONT face="Times New Roman">this鎸囬拡淇濆瓨鍒?FONT face="Times New Roman">pbase鍏ㄥ眬鍙橀噺涓傚湪瀹氫箟鍏ㄥ眬瀵硅薄aa錛屽嵆璋冪敤derived aa;鏃訛紝瑕佽皟鐢ㄥ熀綾葷殑鏋勯犲嚱鏁幫紝鍏堟瀯閫犲熀綾葷殑閮ㄥ垎錛岀劧鍚庢槸瀛愮被鐨勯儴鍒嗭紝鐢辮繖涓ら儴鍒嗘嫾鎺ュ嚭瀹屾暣鐨勫璞?FONT face="Times New Roman">aa銆傝繖涓?FONT face="Times New Roman">this鎸囬拡鎸囧悜鐨勫綋鐒朵篃灝辨槸aa瀵硅薄錛岄偅涔堟垜浠?FONT face="Times New Roman">main()鍑芥暟涓埄鐢?FONT face="Times New Roman">pbase璋冪敤fn()錛屽洜涓?FONT face="Times New Roman">pbase瀹為檯鎸囧悜鐨勬槸aa瀵硅薄錛岃?FONT face="Times New Roman">aa瀵硅薄鍐呴儴鐨勮櫄琛ㄦ寚閽堟寚鍚戠殑鏄嚜韜殑铏氳〃錛屾渶緇堣皟鐢ㄧ殑褰撶劧鏄?FONT face="Times New Roman">derived綾諱腑鐨?FONT face="Times New Roman">fn()鍑芥暟銆?/FONT> 鍦ㄨ繖涓緥瀛愪腑錛岀敱浜庢垜鐨勭枏蹇斤紝鍦?FONT face="Times New Roman">derived綾諱腑澹版槑fn()鍑芥暟鏃訛紝蹇樹簡鍔?FONT face="Times New Roman">public鍏抽敭瀛楋紝瀵艱嚧澹版槑涓轟簡private錛堥粯璁や負private錛夛紝浣嗛氳繃鍓嶉潰鎴戜滑鎵璁茶堪鐨勮櫄鍑芥暟璋冪敤鏈哄埗錛屾垜浠篃灝辨槑鐧戒簡榪欎釜鍦版柟騫朵笉褰卞搷瀹冭緭鍑烘紜殑緇撴灉銆備笉鐭ラ亾榪欑畻涓嶇畻C++鐨勪竴涓?FONT face="Times New Roman">Bug錛屽洜涓鴻櫄鍑芥暟鐨勮皟鐢ㄦ槸鍦ㄨ繍琛屾椂紜畾璋冪敤鍝竴涓嚱鏁幫紝鎵浠ョ紪璇戝櫒鍦ㄧ紪璇戞椂錛屽茍涓嶇煡閬?FONT face="Times New Roman">pbase鎸囧悜鐨勬槸aa瀵硅薄錛屾墍浠ュ鑷磋繖涓鎬幇璞$殑鍙戠敓銆傚鏋滀綘鐩存帴鐢?FONT face="Times New Roman">aa瀵硅薄鍘昏皟鐢紝鐢變簬瀵硅薄綾誨瀷鏄‘瀹氱殑錛堟敞鎰?FONT face="Times New Roman">aa鏄璞″彉閲忥紝涓嶆槸鎸囬拡鍙橀噺錛夛紝緙栬瘧鍣ㄥ線寰浼氶噰鐢ㄦ棭鏈熺粦瀹氾紝鍦ㄧ紪璇戞椂紜畾璋冪敤鐨勫嚱鏁幫紝浜庢槸灝變細鍙戠幇fn()鏄鏈夌殑錛屼笉鑳界洿鎺ヨ皟鐢ㄣ傦細錛?/FONT> 璁稿瀛﹀憳鍦ㄥ啓榪欎釜渚嬪瓙鏃訛紝鐩存帴鍦ㄥ熀綾葷殑鏋勯犲嚱鏁頒腑璋冪敤铏氬嚱鏁幫紝鍓嶉潰宸茬粡璇翠簡錛屽湪璋冪敤鍩虹被鐨勬瀯閫犲嚱鏁版椂錛岀紪璇戝櫒鍙滅湅鍒頒簡鈥濈埗綾伙紝騫朵笉鐭ラ亾鍚庨潰鏄惁鍚庤繕鏈夌戶鎵胯咃紝瀹冨彧鏄垵濮嬪寲鐖剁被鐨勮櫄琛ㄦ寚閽堬紝璁╄铏氳〃鎸囬拡鎸囧悜鐖剁被鐨勮櫄琛紝鎵浠ヤ綘鐪嬪埌緇撴灉褰撶劧涓嶆紜傚彧鏈夊湪瀛愮被鐨勬瀯閫犲嚱鏁拌皟鐢ㄥ畬姣曞悗錛屾暣涓櫄琛ㄦ墠鏋勫緩瀹屾瘯錛屾鏃舵墠鑳界湡姝e簲鐢?FONT face="Times New Roman">C++鐨勫鎬佹с?B>鎹㈠彞璇濊錛屾垜浠笉瑕佸湪鏋勯犲嚱鏁頒腑鍘昏皟鐢ㄨ櫄鍑芥暟錛屽綋鐒跺鏋滀綘鍙槸鎯寵皟鐢ㄦ湰綾葷殑鍑芥暟錛屼篃鏃犳墍璋撱?/B>
1銆佹枃绔犮婂湪VC6.0涓櫄鍑芥暟鐨勫疄鐜版柟娉曘嬶紝浣滆咃細backer 錛岀綉鍧錛?/FONT> http://www.mybole.com.cn/bbs/dispbbs.asp?boardid=4&id=1012&star=1 2銆佷功銆?FONT face="Times New Roman">C++緙栫▼鎬濇兂銆?FONT face="Times New Roman"> 鏈烘宸ヤ笟鍑虹増紺?/FONT> 鏈兂鍐嶅啓璇︾粏浜涳紝鍙戠幇鏃墮棿涓嶅錛屾繪槸鏈夊緢澶氫簨鎯咃紝鍦ㄥ姞涓婃按騫充篃鏈夐檺錛屾兂鎯寵繕鏄互鍚庡啀璇村惂銆備笉榪囨垜鐩鎬俊錛岃繖浜涘唴瀹逛篃鑳藉甯姪澶у寰堝ソ鐨勭悊瑙d簡銆備篃嬈㈣繋緗戝弸鑳藉緇х畫琛ュ厖錛屽ぇ瀹跺彲浠ラ紦鍔ㄩ紦鍔?FONT face="Times New Roman">backer錛岃浠栦粠姹囩紪鐨勮搴﹀啀緇欎竴涓鏄庯紝鍝堝搱錛屽埆璇存垜璇寸殑銆?/FONT>1. 鍑芥暟鐨勮鐩?/H1>
2. 澶氭佹у拰铏氬嚱鏁?/H1>
3. VC瑙嗛絎笁璇?FONT face="Times New Roman">this鎸囬拡璇存槑
4. 鍙傝冭祫鏂欙細
5. 鍚庤