锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
2. 鐢ㄤ緥涔嬮棿鐨勫熀鏈叧緋繪湁錛氭硾鍖栵紝鍖呭惈鍜屾墿灞曘?br />鐢ㄤ緥A鍒癇鐨勬硾鍖栧叧緋昏〃紺篈鍜孊鏄叿浣撲笌鎶借薄鐨勫叧緋匯?br />鐢ㄤ緥A鍒癇鐨勫寘鍚叧緋昏〃紺篈浣跨敤浜咮鎻愪緵鐨勫姛鑳姐?br />鐢ㄤ緥A鍒癇鐨勬墿灞曞叧緋昏〃紺篈鍚態鎻愪緵鐨勫彲鐢ㄧ殑鍔熻兘銆?br />浣嗕粠A鍒癇鐨勫寘鍚叧緋誨拰浠嶣鍒癆鐨勬墿灞曞叧緋繪槸涓嶅悓鐨勶細
A鍖呭惈B璇存槑B鏄粠A涓垎瑙e嚭鏉ョ殑鍏叡琛屼負錛汢鑷韓鏄嫭绔嬬殑錛屼絾瀵逛簬A鏉ヨ鏄笉鍙己灝戠殑涓閮ㄥ垎銆?br />B鎵╁睍A璇存槑B鏄粠A涓垎瑙e嚭鏉ョ殑鍙樹綋琛屼負錛屽繀欏繪寚瀹氭墿灞曠偣錛屼篃灝辨槸鍦ㄥ熀鏈敤渚嬩腑鎵ц鍙樹綋琛屼負鐨勫叿浣撴潯浠躲侭浠呬粎鏄疉鐨勮ˉ鍏咃紝鑰屼笉鏄笉鍙己灝戠殑閮ㄥ垎錛孊鑷韓涔熶笉鏄嫭绔嬬殑銆侫鍙互鍗曠嫭鎵ц錛岃〃紺洪氬父鐨勬儏鍐碉紝鍦ㄧ壒瀹氱殑鎯呭喌涓嬶紝鐢˙鏉ヨˉ鍏呭畠銆?br />鎶借薄鐢ㄤ緥涓嶈兘琚疄渚嬪寲錛屼笉鑳借瀹為檯鎵ц錛屽畠鐨勪綔鐢ㄥ湪浜庢洿濂藉湴緇勭粐鐢ㄤ緥鍏崇郴銆?br />
鍙傝冧功錛?br />銆奤ML鐢ㄦ埛鎸囧崡銆?Grady Booch錛孞ames Rumbaugh錛孖var Jacobson钁?閭電淮蹇犵瓑璇?鏈烘宸ヤ笟鍑虹増紺?br />銆婄粺涓杞歡寮鍙戣繃紼嬨?Ivar Jacobson錛孏rady Booch錛孞ames Rumbaugh钁?鍛ㄤ集鐢熺瓑璇?鏈烘宸ヤ笟鍑虹増紺?br />
鍔ㄦ佸垱寤哄氨鏄垱寤烘煇縐嶇被鍨嬬殑瀵硅薄錛屽叿浣撶被鍨嬪湪榪愯鏃剁‘瀹氾紝緙栬瘧鏃跺彲鑳戒笉鐭ラ亾銆傛瘮濡傝繍琛屾椂鐢ㄦ埛杈撳叆涓涓被鍨嬪悕縐幫紝濡傛灉璇ョ被鍨嬫槸紼嬪簭綾誨瀷浣撶郴涓殑涓鍛橈紝鍒欑▼搴忎腑灝嗚兘澶熷垱寤鴻綾誨瀷鐨勫璞°備笅闈㈢殑浠g爜鏄嬌鐢∕FC鍔ㄦ佸垱寤烘満鍒剁殑涓涓畝鍖栫殑渚嬪瓙錛?/p>
CRuntimeClass* g_pFirstClass;
void func()
{
char szClassName[64];
CRuntimeClass* pClass;
CObject* pObject;
cout << "enter a class name... ";
cin >> szClassName;
for (pClass = g_pFirstClass; pClass != NULL; pClass = pClass->m_pNextClass)
{
if (strcmp(szClassName, pClass->m_lpszClassName) == 0)
pObject = pClass->CreateObject();
}
}
瀹炵幇鍔ㄦ佸垱寤虹殑鎬濊礬鏄妸鍔ㄦ佺殑綾誨瀷鍚嶇О涓庣▼搴忕被鍨嬩綋緋諱腑鐨勬瘡涓涓繘琛屾瘮杈冿紝涓庢煇涓被鍨嬪惢鍚堟椂璁╄綾誨瀷鍒涘緩鑷韓鐨勫璞°傝繖鏍鳳紝鏀寔鍔ㄦ佸垱寤虹殑綾誨簱涓殑姣忎竴涓被閮借棰濆瀹炵幇涓浜涘姛鑳斤紝鍗沖垽鍒竴涓悕縐版槸鍚︿笌鑷韓鐩哥錛屼互鍙婂垱寤鴻嚜韜殑瀵硅薄銆?/p>
鍒ゅ埆涓涓悕縐版槸鍚︿笌鑷韓鐩哥錛岃繖鏄繍琛屾椂綾昏瘑鍒殑鍐呭錛屾墍浠FC鍔ㄦ佸垱寤烘槸鍦≧TCI鍩虹涓婂疄鐜扮殑銆?/p>
RTCI鏄竴涓璞¤兘澶熷垽瀹氳嚜宸辨槸鍚﹀睘浜庢煇縐嶇被鍨嬶紝璇ョ被鍨嬬殑鍚嶇О鍦ㄨ繍琛屾椂紜畾錛岀紪璇戞椂鍙兘涓嶇煡閬撱備粠涓嬮潰鐨勪緥瀛愬緢瀹規槗鐞嗚ВRTCI錛?/p>
void Func()
{
char szClassName[64];
CDocument* pDoc = new CDocument;
cout << "enter a class name... ";
cin >> szClassName;
cout << pDoc->IsKindOf(szClassName); //鏄繑鍥?錛屽惁榪斿洖0
}
鏈変竴鐐歸渶瑕佽鏄庣殑鏄紝鍥犱負CDocument媧劇敓浜嶤Object錛屾墍浠sKindOf瀵逛簬CObject涔熻榪斿洖1銆傚洜涓烘垜浠槸浠庡姩鎬佸垱寤哄嚭鍙戠殑錛屾墍浠ュ鏋滄槸榪欐牱鍙兘浼氭湁涓鐐硅儗紱誨垵琛楓備絾鏄疪TCI鏄庢樉鍜屽姩鎬佸垱寤烘湁瀵嗗垏鑱旂郴錛孯TCI涔熷彲鑳芥湁鍗曠嫭鐨勪環鍊鹼紝鎵浠ュ厛鎶奟TCI瀹炵幇璧鋒潵銆?/p>
瀹炵幇RTCI鐨勬濊礬鏄姣忎竴涓被璁板綍鑷韓鐨勭被鍨嬩俊鎭紝騫舵彁渚汭sKindOf(char*)鍑芥暟榪涜鎵緇欑被鍨嬩笌鑷韓綾誨瀷鐨勬瘮杈冿紝鑰屼笖榪樿鑳借闂熀綾葷殑綾誨瀷淇℃伅錛岃繘琛屾瘮杈冿紝涓鐩村埌鏍圭被銆傛墍浠ヨ褰曠殑綾誨瀷淇℃伅瑕佹寜緇ф壙鍏崇郴榪炶搗鏉ワ紝姣忎釜綾葷殑IsKindOf()榪樿璋冪敤鍩虹被鐨処sKindOf()銆侻FC鎶婅璁板綍鐨勭被鍨嬩俊鎭娊鍙栧埌涓涓狢RuntimeClass緇撴瀯浣撲腑錛屾瘡涓被涓姞鍏ヤ竴涓狢RuntimeClass鎴愬憳鍗沖彲銆?/p>
鐜板湪鍥炲埌鍔ㄦ佸垱寤猴紝鍦≧TCI寤虹珛鐨勬暟鎹粨鏋勫熀紜涓婂皢鍙疄鐜板畠銆傚姩鎬佸垱寤轟粠涓嶅悓浜嶪sKindOf()鐨勮搴︿嬌鐢ㄨ繖涓鏁版嵁緇撴瀯錛屽畠瑕侀亶鍘嗘墍鏈夌被鍨嬬殑CRuntimeClass銆傞偅涔堜粎浠呮湁緇ф壙鍏崇郴鐨勭被鐨凜RuntimeClass鐩歌繛榪樹笉澶燂紝瑕佹妸鎵鏈夌被鐨凜RuntimeClass榪炴垚涓涓摼琛ㄣ傚叾瀹炲姩鎬佸垱寤哄茍涓嶅叧蹇冪被闂寸殑緇ф壙鍏崇郴錛屽畠騫崇瓑鐪嬪緟姣忎釜綾匯傜幇鍦ㄤ互CRuntimeClass涓虹粨鐐規瀯鎴愪竴涓旱妯袱涓柟鍚戠殑閾捐〃錛孖sKindOf()鍜屽姩鎬佸垱寤哄垎鍒嬌鐢ㄥ畠涓嶅悓鐨勪晶闈€?/p>
搴忓垪鍖栫殑姒傚康鏄湪鏂囦歡涓瓨鍌ㄥ璞′俊鎭紝騫惰兘鏍規嵁瀹冩仮澶嶅璞°傚浜庢枃妗h鍥劇粨鏋勭殑杞歡錛岀敤鎴烽渶瑕佷繚瀛樻墍緙栬緫鐨勬枃妗e拰鎵撳紑宸茬紪杈戠殑鏂囨。錛岃繖姝f槸搴忓垪鍖栫殑搴旂敤錛屾墍浠ュ簭鍒楀寲鏄潪甯擱噸瑕佺殑涓縐嶇壒鎬с傚湪搴忓垪鍖栨仮澶嶅璞℃椂錛屽氨鍙互鐢ㄥ埌鍔ㄦ佸垱寤恒?/p>
浣跨敤MFC搴忓垪鍖栫殑渚嬪瓙濡備笅錛?/p>
void CMyDocument::Serialize(CArichive &ar)
{
if (ar.IsStoring())
{
ar << m_pMyClass; //CMyClass m_pMyClass;
}
else
{
ar >> m_pMyClass;
}
}
涓涓敮鎸佸簭鍒楀寲鐨勭被鎻愪緵Serialize(CArchive &)鍑芥暟錛岄噸杞?lt;<鍜?gt;>鎿嶄綔銆傛敞鎰忎袱鑰呮槸涓嶅悓鐨勶紝鍦ㄤ笂渚嬩腑錛孋MyDocument綾葷殑淇℃伅騫朵笉琚簭鍒楀寲錛岃孋MyClass綾葷殑淇℃伅琚簭鍒楀寲銆傚疄闄呬笂涓涓簭鍒楀寲綾葷殑<<鍜?gt;>鎿嶄綔錛屽叾涓嶆秹鍙婄被淇℃伅鐨勯儴鍒嗘槸璋冪敤Serialize()瀹屾垚鐨勶紝瀹冨繀欏誨悓鏃跺疄鐜拌繖涓よ呫?/p>
鎸夌収MFC鐨勮姹傦紝闇瑕佸湪鏀寔搴忓垪鍖栫殑綾誨畾涔変腑浣跨敤DECLARE_SERIAL瀹忥紝鍦ㄧ被瀹炵幇涓嬌鐢↖MPLEMENT_SERIAL瀹忋傛垜浠湅涓涓嬭繖涓や釜瀹忓疄鐜頒簡浠涔堬紝
#define DECLARE_SERIAL(class_name) \
_DECLARE_DYNCREATE(class_name) \
AFX_API friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb);
#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \
CObject* PASCAL class_name::CreateObject() \
{ return new class_name; } \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \
class_name::CreateObject) \
AFX_CLASSINIT _init_##class_name(RUNTIME_CLASS(class_name)); \
CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \
{ pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \
return ar; } \
涓昏鏄姞鍏ヤ簡瀵?gt;>鐨勯噸杞斤紝浣嗘槸娌℃湁閲嶈澆<<錛孧FC浠呮彁渚涗簡CObject瀵?lt;<鐨勯噸杞斤紝濡備笅錛?/p>
_AFX_INLINE CArchive& AFXAPI operator<<(CArchive& ar, const CObject* pOb)
{ ar.WriteObject(pOb); return ar; }
榪欐槸鍥犱負鍦ㄥ簭鍒楀寲璇誨拰鍐欑殑鏃跺欙紝閮介渶瑕佸叿浣撶被鐨凜RuntimeClass淇℃伅銆傜浉搴旂殑GetRuntimeClass()鏄竴涓櫄鍑芥暟錛孋Object閲嶈澆<<錛屽湪鍐欑被淇℃伅鏃惰皟鐢ㄥ埌璇ュ嚱鏁幫紝鐢變簬铏氬嚱鏁版満鍒訛紝鍐欏叆鐨勬槸鍏蜂綋綾葷殑淇℃伅銆備絾鏄繖閲岄殣鍚潃涓涓潯浠訛紝灝辨槸璋冪敤<<鍜孏etRuntimeClass()鏃訛紝鍏蜂綋綾誨璞″凡緇忓瓨鍦ㄤ簡錛岃岃皟鐢?gt;>鍜岃鍏ョ被淇℃伅鏃訛紝璇ョ被瀵硅薄榪樻湭琚垱寤猴紝鎵浠ユ棤娉曞埄鐢ㄨ繖縐嶆満鍒訛紝鍙兘鍦ㄦ瘡涓叿浣撶被涓兘閲嶈澆涓嬈?gt;>銆傛垜瑙夊緱銆婃繁鍏ヨВ鏋怣FC銆嬪榪欎釜闂鐨勮В閲婁笉姝g‘銆?/p>
榪欓噷鏈変竴涓棶棰橀渶瑕佹槑紜竴涓嬶紝搴忓垪鍖栦負浠涔堣鍐欏叆綾諱俊鎭紵涓鏄畠搴旇淇濆瓨瀹屾暣鐨勮兘澶熺嫭绔嬫仮澶嶅璞$殑淇℃伅錛屼簩鏄湪紼嬪簭璇誨叆瀵硅薄鏃訛紝瑕佹妸瀹冪殑綾諱俊鎭拰紼嬪簭涓湡鏈涚殑(鎵鑳藉鐞嗙殑)綾諱俊鎭浉姣旇緝錛岃繘琛屾楠屻?/p>
鐪婭MPLEMENT_SERIAL瀹忓閲嶈澆>>鐨勫疄鐜幫紝鏄彁渚涗竴涓湡鏈涚殑CRuntimeClass緇撴瀯(鐢ㄤ簬媯楠?錛屽鎵楥Archive榪涜瀵硅薄璇誨彇銆傚洜涓鴻瀵硅薄鏃墮鍏堣璺熸枃浠舵墦浜ら亾錛屾墍浠ヤ氦緇機Archive澶勭悊錛岄殢鍚庢妸璇誨嚭鐨勬暟鎹啓鍏ュ璞℃椂錛孋Archive鍐嶈皟鐢ㄥ叿浣撶被鐨凷erialize()錛屽姝ゅ悎浣滄槸鍗佸垎鎭板綋鐨勩傚湪榪欓噷錛孋Archive榪樿礋璐d簡璇誨嚭鍜屾楠岀被淇℃伅錛岀劧鍚庡垱寤哄璞$殑榪囩▼銆傚洜涓轟竴鏂歸潰鍏蜂綋綾誨璞¤繕涓嶅瓨鍦紝鍙︿竴鏂歸潰榪欎簺鎿嶄綔瀵規墍鏈夊叿浣撶被閮芥病鏈夊垎鍒紝搴旇鎻愬嚭鏉ワ紝鍦ㄧ被綰у埆瀹炵幇鎴栬呰鍚堜綔鑰呭疄鐜般傚疄闄呬笂錛孧FC鍏堟妸榪欎釜榪囩▼浜ょ粰CArchive::ReadClass()錛屽悗鑰呭張璋冪敤CRuntimeClass::Load()銆?nbsp;
瀵逛簬搴忓垪鍖栨潵璇達紝鎼炴竻瀹冪殑姒傚康浠ュ悗錛屽氨鏄疄鐜癝erialzie()錛岄噸杞?lt;<鍜?gt;>銆傚<<鍜?gt;>鐨勯噸杞芥秹鍙婂緢澶氬伐浣滐紝MFC宸茬粡甯垜浠疄鐜頒簡錛屾垜浠篃鐪嬭浜嗗ぇ姒傜殑璁捐錛屼富瑕佹槸涓嶤Archive鍒嗗伐鍚堜綔錛屽叾嬈℃槸CRuntimeClass銆?/p>
鐜板湪鐪嬪埌CRuntimeClass緇撴瀯浣撳湪MFC瀵筊TCI錛屽姩鎬佸垱寤哄拰搴忓垪鍖栫殑瀹炵幇涓兘璧風潃閲嶈鐨勪綔鐢紝閲嶆柊璁よ瘑涓涓嬭繖涓暟鎹粨鏋勫緢鏈夊繀瑕併?/p>
CRuntimeClass鍖呭惈浜嗗叧浜庣被鐨勫悇縐嶄俊鎭拰鏈夊叧鎿嶄綔銆傛妸綾誨強鍏跺熀綾葷殑CRuntimeClass榪炴垚涓涓摼琛紝灝卞彲浠ュ緢鏂逛究鍦板疄鐜癛TCI鐨処sKindOf()錛涙妸鎵鏈夌被鐨凜RuntimeClass榪炴垚涓涓摼琛紝鍐嶅姞涓婁竴涓畝鍗曠殑CreateObject鍑芥暟錛屽氨鍙互瀵逛互浠繪剰綾誨悕榪涜鍔ㄦ佸垱寤虹殑浼佸浘鍋氬嚭鍙嶅簲錛汣RuntimeClass榪樺疄鐜頒簡鍚戞枃浠惰鍐欑被淇℃伅鐨凩oad()錛孲tore()錛岄厤鍚堝簭鍒楀寲鐨勫疄鐜般?/p>
鍦ㄥ垎鏋愭秷鎭槧灝勫拰鍛戒護浼犻掓満鍒朵箣鍓嶏紝闇瑕佸Windows紼嬪簭妯″瀷鏈夊緢濂界殑鐞嗚В銆?/p>
鏈畬寰呯畫...
鍙傝冿細
銆婃繁鍏ヨВ鏋怣FC銆?涓浗鐢靛姏鍑虹増紺?br>銆婃繁鍏ユ祬鍑篗FC銆?鍗庝腑縐戝ぇ鍑虹増紺?br>銆奧indows紼嬪簭璁捐銆?鍖楀ぇ鍑虹増紺?/p>
#define聽POW(c)聽(1<<(c))
#define聽MASK(c)聽(((unsigned聽long)-1)聽/聽(POW(POW(c))聽+聽1))
#define聽ROUND(n,聽c)聽(((n)聽&聽MASK(c))聽+聽((n)聽>>聽POW(c)聽&聽MASK(c)))
int聽bit_count(unsigned聽int聽n)

{
聽聽聽聽n聽=聽ROUND(n,聽0);
聽聽聽聽n聽=聽ROUND(n,聽1);
聽聽聽聽n聽=聽ROUND(n,聽2);
聽聽聽聽n聽=聽ROUND(n,聽3);
聽聽聽聽n聽=聽ROUND(n,聽4);
聽聽聽聽return聽n;
}聽璁捐錛?br />
聽 杈撳叆鏄緟鎺掓暟緇勫強鍏墮暱搴︼紝杈撳嚭鎺掑簭鍚庣殑鏁扮粍銆?br />聽聽鍦ㄥ啋娉¤繃紼嬩腑瀵規暟緇勭殑鏈夊簭鎯呭喌榪涜媯鏌ワ紝鍦ㄦ暟緇勫凡緇忔湁搴忔椂渚跨粨鏉熺畻娉曘?br />
浠g爜錛?br />
void BubbleSort(int nArray[], int nLength)
{
聽聽聽聽 bool bSorted = false;
聽聽聽
聽聽聽聽 if (nArray == NULL)
聽聽聽聽聽聽聽聽 throw -1;
聽聽聽
聽聽聽聽 if (nLength < 2)
聽聽聽聽聽聽聽 聽return;
聽聽聽
聽聽聽 for (int i = nLength; !bSorted && i > 1; i--)
聽聽聽 {
聽聽聽聽聽聽聽 聽bSorted = true;
聽聽聽聽聽聽聽
聽聽聽聽聽聽聽聽 for (int j = 1; j < i; j++)
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽 if (nArray[j] < nArray[j-1])
聽聽聽聽聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int n;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 n = nArray[j];
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 nArray[j] = nArray[j-1];
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 nArray[j-1] = n;
聽聽聽聽聽聽聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 bSorted = false;
聽聽聽聽聽聽聽聽聽聽聽聽 }//if
聽聽聽聽聽聽聽聽 }
聽聽聽聽聽}
}
2. 鍙屽悜鍐掓場鎺掑簭
void BiBubbleSort(int nArray[], int nLength)
{
聽聽聽聽int聽 low, high;
聽
聽聽聽聽if (nArray == NULL)
聽聽聽聽聽聽聽throw -1;
聽聽聽聽if (nLength < 2)
聽聽聽聽聽聽聽returnt;
聽聽聽 low = 0;
聽聽聽聽high = nLength - 1;
聽聽聽 while (low < high)
聽聽 {
聽聽聽聽聽聽聽int t;
聽聽聽聽聽聽聽t = low;
聽聽聽聽聽聽聽for (int i = low; i < high; i++)
聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽 if (nArray[i] > nArray[i+1])
聽聽聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽 int n;
聽聽聽聽聽聽聽聽聽聽聽聽聽 n = nArray[i];
聽聽聽聽聽聽聽聽聽聽聽聽聽 nArray[i] = nArray[i+1];
聽聽聽聽聽聽聽聽聽聽聽聽聽 nArray[i+1] = n;
聽聽聽聽聽聽聽聽聽聽聽聽聽 t = i + 1;
聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽 }
聽聽聽聽聽聽 high = t - 1;
聽聽聽聽聽 t = high;
聽聽聽聽 聽for (int j = high; j > low; j--)
聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽 if (nArray[j] < nArray[j-1])
聽聽聽聽聽聽 聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽 int n;
聽聽聽聽聽聽聽聽聽聽聽聽 n = nArray[j];
聽聽聽聽聽聽聽聽聽聽聽聽 nArray[j] = nArray[j-1];
聽聽聽聽聽聽聽聽聽聽聽聽 nArray[j-1] = n;
聽聽聽聽聽聽聽聽聽聽聽聽
聽聽聽聽聽聽聽聽聽聽聽聽 t = j - 1;
聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽 }
聽聽聽聽 low = t + 1;
聽 }//while
}
3. 蹇熸帓搴?br />
聽鎬濇兂錛?br />
聽閫変竴涓灑杞村厓绱狅紝鎶婂緟鎺掑簭鍒楀垝鍒嗘垚涓ゆ錛屽墠涓孌典笉澶т簬鏋㈣醬錛屄犲悗涓孌典笉灝忎簬鏋㈣醬銆傚鏋滆繖涓ゆ鍒嗗埆鏈夊簭錛屽師搴忓垪涔熼殢涔嬫湁搴忋傞氳繃鍒掑垎錛屼竴涓鐨勬帓搴忓彲浠ヨ漿鍖栦負涓や釜瀛愭鐨勬帓搴忥紝鍗沖悓鏍鋒ц川浣嗚緝灝忚妯$殑闂銆傚綋孌電殑闀垮害涓?鏃訛紝鏈韓鏄湁搴忕殑錛岃漿鍖栧彲浠ョ粓姝€?br />
璁捐錛?br />
鐢ㄤ竴涓掑綊鍑芥暟鏉ュ疄鐜板揩閫熸帓搴忕畻娉曪紝閫掑綊緇堟鏉′歡鏄鐨勯暱搴﹀皬浜庣瓑浜?銆?br />涓嬈″垝鍒嗚繃紼嬭璁″涓嬶細鍙栨鐨勭涓涓厓绱犱負鏋㈣醬錛屼粠鏈鍚庝竴涓厓绱犲悜鍓嶄笌鏋㈣醬姣旇緝錛屽彂鐜板皬浜庢灑杞寸殑鍏冪礌鏃訛紝涓庢灑杞翠氦鎹綅緗紝浠庣浜屼釜鍏冪礌鍚戝悗涓庢灑杞存瘮杈冿紝榪欐牱涓ょ鏄凡瀹屾垚鍒掑垎鐨勯儴鍒嗭紝涓棿鏄緟鍒掑垎鐨勯儴鍒嗭紝鏋㈣醬濮嬬粓澶勪簬涓棿閮ㄥ垎鐨勪竴绔紝姣旇緝浠庡彟涓绔悜璇ョ榪涜錛屽彂鐜板垎綾諱笉鍚岀殑鍏冪礌灝卞悓鏋㈣醬浜ゆ崲銆傞殢鐫姣旇緝鍜屼氦鎹㈢殑榪涜錛屼腑闂撮儴鍒嗕笉鏂敹緙?姣忔闀垮害緙╃煭1)錛屽綋鏀剁緝鍒伴暱搴︿負1鏃訛紝鍒掑垎緇堟銆?br />
瀹炵幇瑕佺偣錛?br />
閫掑綊鍑芥暟鐨勫弬鏁版槸寰呮帓搴忓垪鍙婂墠鍚庤竟鐣屻?br />鍒掑垎榪囩▼闇瑕佺敤涓や釜鍙橀噺璁板綍涓棿閮ㄥ垎鐨勮竟鐣屻?br />
浠g爜錛?br />
void QuickSort(int nArray[], int low, int high)
{
聽聽聽聽 int pivot = nArray[low];
聽聽聽聽 int聽i = low錛宩 = high;
聽聽聽
聽聽聽聽 if (high < low)
聽聽聽聽聽聽聽聽聽聽聽return;聽聽聽
聽聽聽聽
聽聽聽聽 while (i < j)
聽聽聽聽 {
聽聽聽聽聽聽聽聽聽 while (i <聽j && nArray[j] >= pivot) j--;
聽聽聽聽聽聽聽聽聽 if (i < j)聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 nArray[i++] = nArray[j];
聽
聽聽聽聽聽聽聽聽聽 while (i <聽j && nArray[i] <= pivot) i++;
聽聽聽聽聽聽聽聽聽 if (i < j)聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 nArray[j--] = nArray[i];
聽聽聽聽 }
聽聽聽聽
聽聽聽聽 nArray[i] = pivot;
聽聽聽
聽聽聽聽 QuickSort(nArray, low,聽i - 1);
聽聽聽聽 QuickSort(nArray,聽i + 1, high);
}
嫻嬭瘯瑕佺偣錛?
綆楁硶鍒嗘瀽錛?br />
鍋囪鍘熷簭鍒楁湁2n涓厓绱狅紝姣忔鍒嗗垝鎶婁竴涓絳夊垎鎴愪袱孌碉紝鍒欑粡榪噉綰ч掑綊綆楁硶緇堟錛屾瘡涓綰ч掑綊鐨勬瘮杈冩繪暟涓簄, 鎵浠uickSort()鐨勬椂闂翠負O(nlog(n))錛岃繖鏄鉤鍧囨儏鍐點傚綋鍘熷簭鍒楁湰韜湁搴忔椂錛孮uickSort()鍑虹幇鏈鍧忔儏鍐碉紝鏃墮棿涓篛(n2)銆?/p>
COM浣滀負涓縐嶄簩榪涘埗緇勪歡妯″瀷錛岃姹傚璞″拰瀹㈡埛灝藉彲鑳藉垎紱伙紝瀹冧滑鐨勪竴鍒囪仈緋婚兘閫氳繃鎺ュ彛榪涜銆備竴涓璞″彲浠ユ湁澶氫釜鎺ュ彛錛岄偅涔堬紝瀹㈡埛鍦ㄨ幏寰楃涓涓帴鍙f寚閽堝悗錛屽簲褰撳彲浠ヤ粠涓涓帴鍙f寚閽堟煡璇笅涓涓帴鍙f寚閽堬紝浠ヤ繚鎸佸璞$殑浣跨敤銆傚鎴峰簲褰撳彲浠ラ氳繃鎺ュ彛綆$悊瀵硅薄鐨勭敓鍛芥湡錛屼互緇撴潫瀵硅薄鐨勪嬌鐢ㄣ備綔涓轟竴縐嶈璁★紝COM瑙勫畾浠庡璞$殑涓涓帴鍙e彲浠ユ煡璇㈠畠鐨勬墍鏈夋帴鍙o紝瀵硅薄鐢熷懡鏈熺鐞嗙殑璐d換鍒嗘暎鍒版瘡涓帴鍙?鍙瀹㈡埛涓烘瘡涓帴鍙h繘琛岀敓鍛芥湡綆$悊錛屽氨鍙互瀹炵幇瀵硅薄鐨勭敓鍛芥湡綆$悊)銆傚湪瀹炵幇涓婏紝COM灝嗘帴鍙f煡璇㈠拰鐢熷懡鏈熺鐞嗙殑璐d換闆嗕腑鍒頒竴涓狪Unknown鎺ュ彛錛屾墍鏈夋帴鍙i兘浠嶪Unknown媧劇敓銆侰OM鎺ュ彛灝辨槸浠嶪Unknown媧劇敓鐨勬帴鍙c?/p>
2. COM鐨勯潰鍚戝璞$壒寰?/p>COM鍦ㄤ簩榪涘埗涓婃彁渚涗簡涓縐嶈蔣浠剁粨鏋勬ā鍨嬶紝騫朵笖甯︽湁闈㈠悜瀵硅薄鐨勭壒寰併?br />
COM瀵硅薄鏄湁鐘舵佺殑錛屾暟鎹拰鎿嶄綔灝佽鍦ㄤ竴璧楓侰OM鎺ュ彛鍜屾櫘閫欰PI鍑芥暟鐨勪笉鍚岋紝灝卞湪浜嶤OM瀵硅薄鏄湁鐘舵佺殑銆傛瘮濡備竴涓畤瀹欓鑸瑰璞?瀹炵幇IMotion鎺ュ彛錛孖Motion鍖呭惈void Fly(double dTime)鍜宒ouble GetPosition()鍑芥暟)錛岃瀹冮琛屼竴孌墊椂闂?閫氳繃IMotion鎺ュ彛璋冪敤Fly()鍑芥暟)浠ュ悗瀹冪殑浣嶇疆灝辨敼鍙樹簡(鍦ㄩ琛屽墠鍚庤皟鐢℅etPosition()寰楀埌涓嶅悓緇撴灉)銆?/p>
鍚屾牱鐨勬帴鍙e彲浠ョ敱涓嶅悓鐨凜OM瀵硅薄瀹炵幇錛屽鎴風▼搴忕敤緇熶竴鐨勬柟娉曡繘琛屽鐞嗭紝鍗村彲浠ュ緱鍒頒笉鍚岀殑緇撴灉銆傛帴鍙d篃鍙互媧劇敓錛屼笉鍚岀殑瀛愭帴鍙e鍩烘帴鍙g殑鍑芥暟鏈変笉鍚岀殑瀹炵幇銆?/p>
鍦ㄨ繖閲岃В閲婁竴涓婱FC瀹炵幇COM瀵硅薄鐨勬満鍒躲備竴涓狢OM瀵硅薄鍙互瀹炵幇澶氫釜鎺ュ彛錛岃岃繖浜涙帴鍙i兘鏄疘Unknown鐨勫瓙鎺ュ彛錛屽畠浠QueryInterface(),聽 AddRef(),聽 Release()鍚勬湁涓浠藉疄鐜頒唬鐮侊紝鑰屽湪鍚屼竴瀵硅薄鍐咃紝榪欎笁涓嚱鏁扮殑鍐呭瀹屽叏鐩稿悓錛屽洜姝ゅ彲浠ユ娊鍑烘潵錛屽媧劇粰璇ュ璞°傚張鐢變簬瀵逛換浣旵OM瀵硅薄錛孉ddRef()鍜孯elease()鐨勫疄鐜版湰璐ㄤ笂涔熺浉鍚岋紝鍥犳鍙互榪涗竴姝ワ紝鎶藉彇榪欎袱涓嚱鏁板強鍏舵搷浣滅殑鏁版嵁(m_Ref)錛屾斁鍒癈CmdTarget涓幓銆俀ueryInterface()鐨勬儏鍐墊湁鎵涓嶅悓錛屽畠鎿嶄綔鐨勬暟鎹槸渚濊禆浜庡叿浣揅OM瀵硅薄鐨勬帴鍙f槧灝勮〃錛屽彲浠ュ湪鎶婂嚱鏁版斁榪汣CmdTarget鐨勫悓鏃訛紝瀹炵幇涓涓繑鍥炴帴鍙f槧灝勮〃鐨勮櫄鍑芥暟錛孮ueryInterface()璋冪敤姝ゅ嚱鏁拌幏寰楀叿浣撶殑鎺ュ彛鏄犲皠琛ㄣ?/p>
COM瀵硅薄鍙互鐢ㄥ寘瀹瑰拰鑱氬悎涓ょ鏂瑰紡閲嶇敤宸叉湁鐨凜OM瀵硅薄銆?/p>
鑱氬悎鏂瑰紡瀹炵幇閲嶇敤姣旇緝澶嶆潅銆?br />
鍦ㄥ疄鐜板璞¤仛鍚堟椂錛岃瑙e喅鐨勪竴涓富瑕侀棶棰樻槸鍦ㄦ帴鍙f煡璇笂瀵圭敤鎴蜂繚鎸侀忔槑銆傚鎴蜂粠鏆撮湶鍑烘潵鐨勫唴閮ㄥ璞℃帴鍙h繘琛屾煡璇紝搴斿綋鏌ュ埌鐨勬槸澶栭儴瀵硅薄鐨勬帴鍙c傞偅涔堟敹鍒版煡璇㈡椂錛屽唴閮ㄥ璞$殑IUnknown搴斿綋鍘誨鎵樺閮ㄥ璞$殑IUnknown銆備絾鏄唴閮ㄥ璞′篃鍙兘涓嶈鐢ㄤ簬鑱氬悎錛屽簲璇ユ湁涓涓甯哥殑IUnknown銆傝繖鏍峰彲浠ヨ冭檻鎶婂唴閮ㄥ璞℃渶鍒濇敹鍒版煡璇㈢殑IUnknown璁炬垚涓涓唬鐞嗭紝瀹冩牴鎹仛鍚堜笌鍚︽妸鏌ヨ璇鋒眰杞氦緇欏閮ㄥ璞Unknown鎴栧唴閮ㄥ璞$殑姝e父IUnknown錛屽嵆鍐呴儴瀵硅薄瀹炵幇涓や釜IUnknown錛屼綔涓轟唬鐞嗙殑濮旀墭IUnknown鍜屾甯哥殑闈炲鎵業Unknown銆傚唴閮ㄥ璞¤繕瑕佺煡閬撳閮ㄥ璞Unknown錛屽茍涓旇兘鍒ゅ埆鑷韓鏄惁琚仛鍚堛傚彲浠ュ湪鍒涘緩鍐呴儴瀵硅薄鏃舵妸澶栭儴瀵硅薄IUnknown鎸囬拡浼犵粰瀹冿紝涓嶆槸鑱氬悎鏃朵紶閫掍竴涓┖鎸囬拡錛岃繖鏍峰唴閮ㄥ璞″氨寰楀埌浜嗚凍澶熶俊鎭?/p>
寮曠敤璁℃暟鐨勭鐞嗕篃鏄竴鏍鳳紝鍐呴儴瀵硅薄鐨勫鎵業Unknown鍖哄埆琚仛鍚堜笌鍚︼紝璋冪敤澶栭儴瀵硅薄IUnknown鎴栬嚜韜殑闈炲鎵業Unknown銆?/p>
褰撶劧錛屼粠澶栭儴瀵硅薄鎺ュ彛瑕佽兘鏌ュ埌鍐呴儴瀵硅薄鎺ュ彛銆傚閮ㄥ璞¢渶瑕佺煡閬撳唴閮ㄥ璞$殑IUnknown錛屼互鏌ヨ鎵瑕佹毚闇茬粰瀹㈡埛紼嬪簭鐨勬帴鍙c傝繖涓狪Unknown搴斿綋鏄唴閮ㄥ璞$殑闈炲鎵業Unknown銆?/p>
2NF鍜?NF鐨勬兜涔夋槸錛氶敭鏄叧緋葷殑鏍囪瘑淇℃伅錛岄潪涓誨睘鎬ф槸闄勫睘淇℃伅銆傚鏋滈檮灞炰俊鎭鏍囪瘑淇℃伅鐨勪緷璧栦笉澶熺揣瀵嗭紝鍏崇郴鐨勮涔夊崟綰у氨宸紝浠庤屽鏄撳嚭鐜板悇縐嶆洿鏂板紓甯搞?
濡傛灉榪濆弽2NF錛屾棦瀛樺湪闈炰富灞炴у閿殑閮ㄥ垎渚濊禆錛屼細鏈変粈涔堥棶棰橈紵渚嬪鍏崇郴妯″紡SCGT(S#,C#,G,TN)錛孲#鏄鐢熷彿錛孋#鏄紼嬪彿錛孏鏄垚緇╋紝TN鏄換璇炬暀甯堝鍚嶏紝鍋囪姣忛棬璇懼彧鏈変竴涓暀甯堛?S#,C#)鏄敭錛孋#->TN鏄潪涓誨睘鎬у閿殑閮ㄥ垎渚濊禆錛屽洜涓哄畠鐨勫瓨鍦ㄤ細浜х敓涓夌鏇存柊寮傚父錛?). 涓嶅紑璇劇殑鏁欏笀濮撳悕鏃犳硶鎻掑叆錛?). 涓闂ㄨ鐨勬墍鏈夊鐢熼兘閫閫夛紝鍒欎換璇炬暀甯堝鍚嶆棤娉曚繚鐣欙紱3). 涓闂ㄨ鏇存崲鏁欏笀鏃訛紝蹇呴』瀵歸夎璇劇殑鎵鏈夊鐢熻繘琛屼慨鏀廣傞潪涓誨睘鎬у閿殑閮ㄥ垎渚濊禆鍙嶆槧浜嗛檮灞炰俊鎭拰鏍囪瘑淇℃伅鐨勭己涔忔暣浣撲竴鑷存э紝鎵浠ヤ細浜х敓浠ヤ笂闂銆?/p>
濡傛灉絎﹀悎2NF錛屼絾榪濆弽3NF錛屽嵆瀛樺湪闈炰富灞炴у閿殑浼犻掍緷璧栵紝浼氭湁浠涔堥棶棰橈紵渚嬪鍏崇郴妯″紡SDL(S#,DEPT,LOC)錛孲#鏄鐢熷彿錛孌EPT鏄墍鍦ㄧ郴錛孡OC鏄郴鐨勫姙鍏湴錛岃繖閲孲#鏄敭錛孲#->DEPT錛孌EPT-/>S#錛孌EPT->LOC錛孡OC浼犻掍緷璧栦簬S#錛屽洜涓哄畠鐨勫瓨鍦ㄤ細浜х敓涓夌鏇存柊寮傚父錛?). 濡傛灉涓涓郴鏂版垚绔嬪皻鏈嫑鐢燂紝鍒欐棤娉曟彃鍏ワ紱2). 濡傛灉涓涓郴涓嶅啀鎷涚敓錛屼絾浠嶄負鍏朵粬緋誨紑璇撅紝鍒欑幇鏈夊鐢熸瘯涓氬悗錛岀郴鐨勪俊鎭棤娉曚繚鐣欙紱3). 涓涓郴鏇存崲鍔炲叕鍦版椂錛屽繀欏誨璇ョ郴鐨勬墍鏈夊鐢熻繘琛屼慨鏀廣傞潪涓誨睘鎬у閿殑浼犻掍緷璧栧弽鏄犱簡闄勫睘淇℃伅鍜屾爣璇嗕俊鎭己涔忕洿鎺ヤ竴鑷存э紝鎵浠ヤ細浜х敓浠ヤ笂闂銆傜己涔忕洿鎺ヤ竴鑷翠笉濡傜己涔忔暣浣撲竴鑷撮偅鏍蜂弗閲嶏紝鎵浠ュ埌浜?NF鎵嶆帓闄ゃ?/p>
閭d箞BCNF鐨勬兜涔夊湪鍝噷鍛紵
2NF鍜?NF瀵逛竴涓叧緋繪ā寮忎腑鐨勯潪涓誨睘鎬у姞浠ラ檺鍒訛紝鑰屽拷鐣ラ敭涔嬮棿鐨勫叧緋匯傚鏋滀竴涓富灞炴т緷璧栧惈閿笉瀹屽叏鐨勫睘鎬х粍鎰忓懗鐫浠涔堝憿錛熷彲浠ヨ瘉鏄庯紝璇ヤ緷璧栨秹鍙婁笉姝竴涓敭錛屽叾鍐沖畾瀛愭湁涓ょ鎯呭喌錛屼竴縐嶆槸閮ㄥ垎閿紝涓縐嶆槸鍚儴鍒嗛敭鍜岄敭澶栫殑灞炴с傜涓縐嶆儏鍐典笅瀛樺湪涓涓敭涔嬪鐨勫睘鎬у璇ラ敭鐨勯儴鍒嗕緷璧栵紱絎簩縐嶆儏鍐典笅錛屽彇涓涓笉鍚墠榪頒富灞炴х殑閿紝鏄撶煡瀛樺湪璇ュ睘鎬у璇ラ敭鐨勪紶閫掍緷璧栵紝鍗充竴涓敭澶栫殑灞炴у璇ラ敭鐨勪紶閫掍緷璧栵紝鎺掗櫎榪欎袱縐嶆儏鍐靛氨寰楀埌BCNF銆備負浠涔堣榪欐牱鍋氬憿錛熷洜涓烘湁澶氫釜閿殑鎯呭喌涓嬶紝蹇呴』鐓ч【姣忎竴涓敭錛屽鏋滈敭涔嬪鐨勫睘鎬у拰璇ラ敭涓嶈兘淇濇寔鏁翠綋鍜岀洿鎺ョ殑涓鑷達紝涔熷彲鑳戒駭鐢熸洿鏂板紓甯搞備緥濡係CZ(S,C,Z)錛孲錛孋錛孼鍒嗗埆琛ㄧず琛楅亾錛屽煄甯傦紝閭紪錛屽叧緋繪ā寮忎笂鐨勪緷璧栭泦涓簕SC->Z,Z->C}錛孲C鍜孲Z閮芥槸閿傚鏋滄彃鍏ヤ竴涓煄甯傜殑鎬婚偖緙栵紝蹇呴』鍊熷姪涓涓閬擄紝鍒犻櫎榪欎釜琛楅亾錛屽煄甯傜殑鎬婚偖緙栦篃琚垹闄わ紝鍑虹幇榪欑鎯呭喌鏄洜涓篊涓嶴Z閿己涔忔暣浣撲竴鑷存с?br />
鍙傝冿細
鐜嬭兘鏂屻婃暟鎹簱緋葷粺鏁欑▼銆?鐢靛瓙宸ヤ笟鍑虹増紺?/p>
1. 瀹㈡埛-鏈嶅姟鍣ㄩ氫俊涓殑鍩烘湰闂
瀹㈡埛鍜屾湇鍔″櫒閫氫俊鏄負浜嗕嬌鐢ㄦ湇鍔★紝涓烘鍦ㄤ紶杈撴満鍒剁殑鍩虹涓婅璁″崗璁紝閫氳繃瀵歸氫俊琛屼負鐨勮鑼冿紝瀹炵幇閫氫俊鐨勭洰鐨勶紝騫惰В鍐充紶杈撲腑鐨勯棶棰樸?/p>
浼犺緭鏈哄埗閫氬父鐢變笅灞傚崗璁彁渚涳紝鏍規嵁涓嶅悓鐨勯氫俊闇瑕侀夋嫨涓嶅悓鐨勪笅灞傚崗璁紝榪欐槸涓涓熀鏈殑闂銆傚搴旂敤鍗忚鏉ヨ錛屽彲鐢ㄧ殑浼犺緭鏈哄埗鏈夊彲闈犺繛鎺ョ殑瀛楄妭嫻佺被鍨嬪拰涓嶅彲闈犳棤榪炴帴鐨勬暟鎹姤綾誨瀷銆?/p>
鏈嶅姟鍣ㄥ鐞嗗ぇ閲忓鎴風殑璇鋒眰錛屼粠鑰屽茍鍙戞槸鏈嶅姟鍣ㄧ殑涓涓熀鏈棶棰橈紝濡備綍澶勭悊榪欎釜闂涔熷彇鍐充簬閫氫俊闇瑕併傚鐞嗘柟寮忎笂錛屾湇鍔″櫒鍙互鏄驚鐜殑鎴栧茍鍙戠殑錛屽茍鍙戞湇鍔″櫒鏈夊縐嶅疄鐜版柟寮?寮傛I/O錛屽綰跨▼鍜屽榪涚▼)銆?/p>
涓浠朵簨鎯呰兘鏃犻噸澶嶅湴榪炵畫榪涜錛岄氬父浼氳幏寰楁洿濂界殑鏁堢巼錛岃繖瑕佹眰涓諱綋濮嬬粓鐭ラ亾褰撳墠鐨勭姸鎬併備竴嬈¢氫俊榪囩▼鐨勮繛緇у彇鍐充簬閫氫俊鍙屾柟錛屽畠浠兘瑕佺煡閬撻氫俊榪涜鐨勭姸鎬併傝繖瀵瑰鎴蜂竴鑸笉鎴愰棶棰橈紝浣嗘湇鍔″櫒瑕佸拰澶ч噺瀹㈡埛閫氫俊錛屼笉涓瀹氳兘涓烘瘡涓鎴風殑姣忔閫氫俊淇濆瓨鐘舵併傚鏋滄湇鍔″櫒鏄湁鐘舵佺殑錛岄偅涔堝氨鏇村揩鍦拌綆楀搷搴旓紝鍑忓皯閫氫俊鐨勬暟鎹噺銆備絾鏄紶杈撳拰瀹㈡埛鐨勬晠闅滀嬌鏈夌姸鎬佹湇鍔″櫒闈復寰堝ぇ闂錛屽綋浼犺緭涓嶅彲闈?鎶ユ枃閲嶅錛屼涪澶憋紝涔卞簭)鏃訛紝鏈嶅姟鍣ㄧ淮鎶ょ殑鐘舵佷細鍜屽鎴峰け鍘諱竴鑷達紝涓涓笉鏂穿婧冮噸鍚殑瀹㈡埛浼氶犳垚鐘舵佷俊鎭笉鑳藉彂鎸ヤ綔鐢紝鑰岀淮鎶ゅ紑閿鍗存瀬澶у鍔犮?/p>
榪欏氨鎻愬嚭浜嗗鎴?鏈嶅姟鍣ㄩ氫俊涓殑涓変釜鍩烘湰闂錛屽畠浠殑瑙e喅鏂規閮藉彇鍐充簬瀹為檯闇瑕侊紝瀹㈡埛-鏈嶅姟鍣ㄩ氫俊涓湁鍝簺鎯呭喌鐨勯渶瑕佸憿錛?/p>
閫氬父鏍規嵁鍓嶄袱涓熀鏈棶棰樻妸鏈嶅姟鍣ㄥ疄鐜板垎涓哄洓縐嶇被鍨嬶紝瀹冧滑鐨勯傜敤鑼冨洿濡備笅錛?/p>
2. winsock鍩烘湰鍑芥暟鐨勪嬌鐢?/p>
winsock鐨勫熀鏈嚱鏁版湁WSAStartup()錛學SACleanup()錛宻ocket()錛宑losesocket()錛宐ind()錛宭isten()錛宎ccept()錛?connect()錛宻end()鍜宺ecv()銆?/p>
浣跨敤榪欎簺鍑芥暟錛屽鎴風鐨勫ぇ姒傜畻娉曟槸錛?/p>
鏈嶅姟鍣ㄧ鐨勫ぇ姒傜畻娉曟槸錛?/p>
鏈変互涓嬪嚑鐐歸渶瑕佽繘涓姝ヨ鏄庯紝
1). 瀹㈡埛绔皟鐢╟onnect()鍜屾湇鍔″櫒绔皟鐢╝ccept()鎴愬姛鍚庡皢鍦ㄥ鎴瘋繘紼嬪拰鏈嶅姟鍣ㄨ繘紼嬩箣闂村緩绔嬩竴涓猅CP榪炴帴銆傝繛鎺ヤ袱绔殑姣忎釜濂楁帴瀛楁弿榪扮閮藉寘鍚竴涓湰鍦扮鐐瑰湴鍧鍜屼竴涓繙紼嬬鐐瑰湴鍧銆傛墍浠ュ湪浣跨敤榪炴帴濂楁帴瀛楀彂閫佹暟鎹椂涓嶇敤鎸囩ず鐩殑鍦板潃銆?/p>
2). 澶氬涓諱富鏈虹殑IP鍦板潃閫夋嫨闂銆備粠涓婇潰鐨勭畻娉曞鏄撴彁鍑鴻繖鏍風殑闂錛屼負浠涔堝鎴風鍦ㄤ嬌鐢ㄥ鎺ュ瓧鏃朵笉緇戝畾绔偣鍦板潃錛熼氬父鐨勪富鏈哄彧鏈変竴涓狪P錛屼絾鏄瀹夸富涓繪満鏈夊涓狪P鍦板潃錛屽湪榪欑鎯呭喌涓嬶紝瀹㈡埛绔負濂楁帴瀛楁寚瀹氱殑IP鍙兘涓庡疄闄呭彂閫佹椂緇忚繃鐨処P涓嶇錛屾墍浠ュ厑璁稿鎴風涓嶆寚瀹氬鎺ュ瓧鍦板潃錛岃岀敱TCP/IP杞歡鍦ㄥ疄闄呭彂閫佹椂鎸囧畾IP錛屽悓鏃墮夋嫨涓涓湭鐢ㄨ繃鐨勭鍙e彿錛岃繖姝f槸鍦╟onnect()璋冪敤涓畬鎴愮殑銆傞偅涔堟湇鍔″櫒绔氨涓嶅瓨鍦ㄥ悓鏍風殑鎯呭喌鍚楋紵涓嶆槸錛屽湪瀹冭皟鐢╞ind()鏃舵寚瀹氫竴涓鎺ュ瓧鍦板潃錛屽叾绔彛閮ㄥ垎閲囩敤搴旂敤鍗忚鐨勭啛鐭ョ鍙o紝鑰孖P鍦板潃閮ㄥ垎鏈夌潃鍚屾牱鐨勯棶棰樸備負姝ゅ畾涔変簡涓涓唬琛ㄧ粺閰嶅湴鍧鐨勫父閲廔NADDR_ANY錛岀敤瀹冩寚紺篒P鍦板潃閮ㄥ垎銆傚疄闄呬嬌鐢ㄧ殑IP浠嶇劧鏄敱TCP/IP杞歡鍒嗛厤銆?/p>
3). TCP涓轟竴涓繛鎺ョ殑鍙戦佺鍜屾帴鏀剁鍚勭淮鎶や竴涓紦鍐插尯銆傚綋鍙戦佺緙撳啿鍖烘弧鐨勬椂鍊欙紝send()璋冪敤浼氶樆濉烇紝鍦ㄦ帴鏀剁緙撳啿鍖轟負絀虹殑鏃跺欙紝recv()璋冪敤浼氶樆濉炪備負浠涔堣鍦ㄩ氫俊榪涚▼鍜孴CP榪炴帴涔嬮棿緇存姢涓涓棿鎺ュ眰鍛紵鍙兘鏄負浜嗗湪涓绔湁澶氫釜榪涚▼瑕佷嬌鐢ㄤ俊閬撶殑鎯呭喌涓嬶紝鍦ㄥ涓繘紼嬩箣闂磋繘琛屼俊閬撳垎閰嶇殑鍗忚皟銆傛瘮濡傚湪鍙戦佺錛屼俊閬撲紶杈撴暟鎹椂send()璋冪敤鍙互緇х畫鎵ц錛屽涓繘紼嬬殑send()璋冪敤鍚岀紦鍐插尯鎵撲氦閬擄紝褰兼褰卞搷涓嶅ぇ錛屽洜涓鴻鍐欑紦鍐插尯閫熷害寰堝揩錛岃屼俊閬撳悓緙撳啿鍖烘墦浜ら亾錛岃繖鏃跺彲浠ュ鍚勮繘紼嬬殑鍙戦佹暟鎹繘琛屽崗璋冿紝瀹炵幇鍏鉤鐨勪俊閬撳垎閰嶃傚彟澶栵紝鍦═CP涓湁婊戝姩紿楀彛姒傚康錛屾槸鐢ㄤ簬嫻侀噺鎺у埗鐨勶紝鍓嶈堪緙撳啿鍖哄拰婊戝姩紿楀彛鏈変粈涔堝叧緋伙紵鎴戠幇鍦ㄤ笉澶竻妤氥?/p>
4). 濂楁帴瀛楃殑鍏抽棴闂銆傚湪瀹㈡埛鏈哄拰鏈嶅姟鍣ㄩ氳繃TCP榪炴帴瀹屾垚鏁版嵁浜ゆ崲鍚庯紝鏈変竴涓畨鍏ㄥ叧闂殑闂銆備竴鏂歸潰錛屾湇鍔″櫒涓嶈兘鍏抽棴榪炴帴錛屽洜涓哄鎴鋒満鍙兘榪樻湁璇鋒眰錛屽彟涓鏂歸潰錛屽鎴鋒満铏界劧鐭ラ亾浣曟椂涓嶅啀璇鋒眰錛屼絾鏄畠涓嶇煡閬撴湇鍔″櫒鐨勫搷搴斾綍鏃跺彂閫佸畬錛屽洜涓烘湁浜涘簲鐢ㄥ崗璁殑鍝嶅簲鏁版嵁閲忎笉紜畾銆備負姝ら噰鐢ㄩ儴鍒嗗叧闂殑鍔炴硶錛岃櫧鐒惰繛鎺ユ槸鍙屽悜鐨勶紝浣嗘槸鍏佽鍦ㄤ竴涓柟鍚戜笂鍏抽棴瀹冿紝褰撳鎴風涓嶅啀璇鋒眰鏃訛紝鍙互閮ㄥ垎鍏抽棴榪炴帴錛屼嬌鏈嶅姟鍣ㄦ敹鍒頒竴涓俊鍙鳳紝濡傛灉鍝嶅簲鍙戦佸畬浜嗭紝鏈嶅姟鍣ㄥ氨鍙互鍏抽棴榪炴帴錛屾鏃惰繛鎺ヨ瀹屽叏鍏抽棴
3. 濂楁帴瀛楁帴鍙d腑鐨勭鐐瑰湴鍧
绔偣鍦板潃鐢ㄦ潵琛ㄧず閫氫俊鐨勮繘紼嬶紝鏄紶杈撳眰鍗忚鍙婂叾濂楁帴瀛楁帴鍙d腑鐨勯噸瑕佹蹇點備笉鍚岀殑鍗忚鏃忓彲浠ョ敤涓嶅悓鏂瑰紡琛ㄧず绔偣鍦板潃錛屼竴涓崗璁棌榪樺彲浠ユ湁澶氫釜鍦板潃鏃忥紝姣忎釜鍦板潃鏃忕殑鍦板潃鏍煎紡涓嶅悓銆俆CP/IP鍙湁涓涓湴鍧鏃忥紝瀹冪殑绔偣鍦板潃鍖呮嫭涓涓?2浣岻P鍦板潃鍜屼竴涓?6浣嶇鍙e彿銆傚湪鍗忚鏃忓拰鍦板潃鏃忕殑鍩虹涓婏紝濂楁帴瀛楁帴鍙g敤鏇翠負鍏蜂綋鐨勭粨鏋勬潵琛ㄧず绔偣鍦板潃銆?/p>
濂楁帴瀛楁槸涓縐嶉傜敤浜庡涓崗璁棌鐨勬帴鍙o紝騫跺厑璁鎬竴涓崗璁棌浣跨敤澶氫釜鍦板潃鏃忋俆CP/IP鍗忚鏃忓強鍏跺敮涓鍦板潃鏃忕殑鏍囪瘑鍒嗗埆鏄疨F_INET鍜孉F_INET銆傜敱浜庡鎺ュ瓧鎺ュ彛鐨勯氱敤鎬э紝瀹冩彁渚涗竴涓氱敤鐨勫湴鍧緇撴瀯錛屽叾鏍煎紡涓?鍦板潃鏃忥紝璇ユ棌涓殑濂楁帴瀛楀湴鍧)銆傚鎺ュ瓧浣滀負涓涓帴鍙f爣鍑嗭紝鍙互鏈変笉鍚屽疄鐜幫紝浠ヤ笅鎴戜滑鍙璁簑indows濂楁帴瀛椼?/p>
濡備笅瀹氫箟鐨剆ockaddr瀹炵幇浜嗗墠榪伴氱敤鍦板潃緇撴瀯錛?/p>
// winsock2.h
struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
sockaddr鐨勯氱敤鎬ф槸鐩稿鐨勶紝鏌愪簺鍦板潃鏃忎笉閫傚悎榪欎釜緇撴瀯銆?/p>
灝界sockaddr閫傚悎浜嶵CP/IP鍗忚鏃忥紝浣嗘槸winsock榪樺畾涔変簡TCP/IP涓撶敤鐨勫湴鍧鏍煎紡錛?/p>
// winsock2.h
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sin_family鍩熷彇鍊兼亽涓篈F_INET銆傚叾涓殑in_addr緇撴瀯琛ㄧずIP鍦板潃錛屽畾涔夊涓嬶紝
//winsock2.h
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr
/* can be used for most TCP & IP code */
#define s_host S_un.S_un_b.s_b2
/* host on imp */
#define s_net S_un.S_un_b.s_b1
/* network */
#define s_imp S_un.S_un_w.s_w2
/* imp */
#define s_impno S_un.S_un_b.s_b4
/* imp # */
#define s_lh S_un.S_un_b.s_b3
/* logical host */
};
涓轟簡淇濊瘉杞歡鐨勫彲縐繪鎬т笌鍙淮鎶ゆэ紝璁塊棶TCP/IP鐨勪唬鐮佷笉搴斾嬌鐢╯ockaddr銆傚彧浣跨敤TCP/IP鐨勫簲鐢ㄧ▼搴忓彲浠ュ彧浣跨敤sockaddr_in錛岃屾案榪滀笉鐢╯ockaddr銆?/p>
4. winsock紼嬪簭瀹炰緥
銆妚c6鎶鏈唴騫曘嬬殑渚嬬▼ex34a鍖呮嫭涓涓獁eb鏈嶅姟鍣ㄥ拰涓変釜瀹㈡埛錛屾湇鍔″櫒鐢╳insock瀹炵幇錛屼竴涓鎴風敤winsock錛屽彟涓や釜鐢╳ininet銆傛垜浠互winsock瀹炵幇鐨勬湇鍔″櫒鍜屽鎴蜂負渚嬨?/p>
CBlockingSocket瀵瑰悇鎺ュ彛鍑芥暟榪涜灝佽錛屼嬌瀹冧滑鐨勮皟鐢ㄥ彲浠ョ粺涓鎶ラ敊銆傛妸閿欒媯鏌ュ拰鍑芥暟璋冪敤涓璧峰皝瑁呭彲浠ラ伩鍏嶆瘡嬈¤皟鐢ㄨ繖浜涘嚱鏁版椂閮芥閿欍備負緇熶竴鎶ラ敊錛岄噰鐢ㄤ簡寮傚父鏈哄埗錛屽湪媯鍑洪敊璇悗鎶涘嚭寮傚父錛岀劧鍚庣粺涓榪涜寮傚父澶勭悊銆傚紓甯告満鍒朵嬌鎴戜滑鍙互鎶婇敊璇鏌ュ拰閿欒澶勭悊鍒嗗紑錛屾鏌ュ繀欏繪槸鍒嗘暎鐨勶紝浣嗘槸澶勭悊鍙互閫傚綋闆嗕腑錛屼嬌浠g爜綆鍖栥?/p>
CHttpBlockingSocket鏍規嵁鎺ユ敹http鎶ユ枃鐨勭壒鐐瑰CBlockingSocket榪涜浜嗘墿灞曘傛垚鍛樺嚱鏁癛eadHttpHeaderLine()鍙互浠嶵CP榪炴帴涓寜琛屾帴鏀跺瓧絎?瀹冨紩鍏ヤ簡涓涓紦鍐插尯錛岀紦鍐插尯涓敹鍒扮殑瀛楃鏋勬垚涓琛屽悗鍐嶈緭鍑恒傝緙撳啿鍖虹殑闀垮害闇瑕佽兘澶熷綰蟲瘡涓琛屽瓧絎︼紝婧㈠嚭鏃舵姤閿欍傛帴鏀惰緭鍑鴻鐨勭紦鍐插尯涔熷彲鑳介暱搴︿笉瓚籌紝榪欐椂鎺ユ敹鐨勬暟鎹笉瓚充竴琛岋紝鍦ㄨ皟鐢≧eadHttpHeaderLine()鏃惰娉ㄦ剰榪欎竴鐐?錛孯eadHttpResponse()鐢ㄤ簬鎺ユ敹棣栭儴琛屼箣鍚庢墍鏈夌殑鍝嶅簲錛屽綋璋冪敤鑰呮彁渚涚殑緙撳啿鍖轟笉瓚蟲椂浼氭姤閿欍傜紦鍐插尯涓嶈凍鐨勬儏鍐甸兘鏄湪CBlockingSocket::Receive()鍑芥暟涓嫻嬪埌鐨勶紝璇ュ嚱鏁拌皟鐢ㄤ互涓婂眰嬈′腑鐨勪唬鐮佹寜鐓ф甯告儏鍐電紪鍐欍?/p>
CSockAddr鏄竴涓笌sockaddr_in鍚屾牱鐢ㄩ旂殑綾伙紝浣嗘槸鐢ㄦ硶鏇存柟渚褲倃insock鍑芥暟浣跨敤鐨勭鐐瑰湴鍧緇撴瀯鏄痵ockaddr錛宻ockaddr_in鏈韓鐢ㄦ潵浠f浛瀹冿紝鎵浠SockAddr闇瑕佽兘澶熸浛浠ockaddr銆俿ockaddr鍙兘鐢ㄥ湪浼犲兼垨浼犲潃鍙傛暟涓紝CSockAddr蹇呴』鍦ㄩ昏緫涓婂拰瀛樺偍涓婇兘鍜宻ockaddr鏈夌瓑浠鋒э紝騫跺疄鐜版湁鍏沖己鍒剁被鍨嬭漿鎹€侰SockAddr榪樺疄鐜頒簡鍜宻ockaddr, sockaddr_in浜掔浉杞崲鐨勬垚鍛樺嚱鏁幫紝鍥犱負涓縐嶇粨鏋勫緢闅懼湪鎵鏈夋儏鍐典笅閮藉ソ鐢紝鏂扮粨鏋勪篃闇瑕佸拰鏃х粨鏋勪繚鎸佸吋瀹廣?br>
鏈緥涓噰鐢ㄦ湇鍔″櫒鍏抽棴濂楁帴瀛楃殑鍔炴硶錛屽洜涓烘瘡嬈¤繛鎺ュ彧澶勭悊涓涓姹傘?br>
鍙傝冿細
銆婄敤TCP/IP榪涜緗戦檯浜掕仈絎笁鍗?windows濂楁帴瀛楃増)銆?娓呭崕鍑虹増紺?/p>
銆妚c6鎶鏈唴騫?5th ed銆?甯屾湜鐢靛瓙鍑虹増紺?/p>
鎴戜滑鐭ラ亾姒傚康鏄漢浠湪鏌愪釜棰嗗煙涓疄璺電粡楠岀殑鎬葷粨錛屽茍鍙兘鍙戝睍涓虹悊璁恒傛蹇墊槸浠ュ瑙備簨鐗╀負鍩虹錛屼絾涓嶆槸瀵瑰瑙備簨鐗╃殑鍒繪澘鍙嶆槧銆傚畠鏉ヨ嚜浜庡疄璺碉紝鎵浠ュ寘鍚富浣撳洜绱狅紝榪欐槸寰堥噸瑕佺殑銆傚疄璺墊槸姒傚康鐨勬牴鏈潵婧愶紝鐞嗚涓婄殑闇瑕佸姒傚康褰㈡垚涔熸湁涓浜涗綔鐢ㄣ?/p>
杞歡涓嬌鐢ㄧ殑瀵硅薄綾諱技浜庨鍩熶腑浣跨敤鐨勬蹇點傘奤ML涓庢ā寮忓簲鐢ㄣ嬩腑璇達紝闈㈠悜瀵硅薄灝辨槸鎸夌収姒傚康鑰屼笉鏄姛鑳借繘琛屽垎瑙c備負浠涔堣蔣浠惰浣跨敤姒傚康鎬у厓绱犲憿錛熷洜涓轟漢鐨勮璇嗘槸姒傚康鎬х殑錛岃岃蔣浠剁敱浜烘潵浣跨敤錛屼漢鏉ュ紑鍙戙備負浜嗘彁渚涙湁鑹ソ姒傚康鎬х殑鐢ㄦ埛鎺ュ彛錛岃蔣浠舵湰韜傚疁閲囩敤姒傚康鎬у厓绱犮傜敱浜烘潵寮鍙戠殑杞歡鍒欐洿闇瑕侀噰鐢ㄦ蹇墊у厓绱狅紝杞歡鏈韓鍜岄鍩熷疄璺甸兘鏈夊法澶х殑澶嶆潅鎬э紝浜轟笉鏄寜鐓у姛鑳芥у厓绱犳潵鎬濊冪殑錛岄潰鍚戝璞″彲浠ヨ寮鍙戜漢鍛樼敤姒傚康鎬у厓绱犳濊冿紝浠庤屽鍔犲澶嶆潅鎬х殑閫傚簲鍜屾帶鍒惰兘鍔涖?/p>
棰嗗煙姒傚康鏄璞$殑閲嶈鏉ユ簮錛屼絾鏄璞′篃褰㈡垚浜庤蔣浠跺紑鍙戠殑榪囩▼銆備竴鏂歸潰錛岃蔣浠剁殑浣跨敤娌℃湁鏀瑰彉棰嗗煙瀹炶返鐨勬湰璐紝鑷沖皯娌℃湁瀹屽叏鏀瑰彉錛岃屾蹇靛弽鏄犱簡棰嗗煙涓凡緇忔垚鐔熺殑璁よ瘑錛屾墍浠ユ槸闈炲父閲嶈鐨勬寚瀵煎拰鍙傝冦傚彟涓鏂歸潰錛岄鍩熷疄璺電敱杞歡榪涜鍜岀敱浜鴻繘琛岀‘瀹為潪甯鎬笉鍚岋紝瑕佹眰榪涜鏂扮殑璁よ瘑錛岃蔣浠舵湰韜殑闇瑕佷篃浼氬獎鍝嶅埌瀵硅薄鐨勫艦鎴愩?/p>
闈㈠悜瀵硅薄鐨勫熀鏈壒寰佸弽鏄犵潃姒傚康鐨勫熀鏈壒寰併?/p>
Stroustrup鐨勩奀++紼嬪簭璁捐璇█銆嬩腑璇達細
“綾誨簲璇ョ敤浜庢ā鎷熺▼搴忓憳鐨勫拰搴旂敤鐨勪笘鐣岄噷鐨勯偅浜涙蹇點?..涓涓蹇典笉浼氬绔嬪湴瀛樺湪錛屽畠鎬諱笌涓浜涚浉鍏崇殑姒傚康鍏卞瓨錛屽茍鍦ㄤ笌鐩稿叧姒傚康鐨勭浉浜掑叧緋諱腑琛ㄧ幇鍑哄畠鐨勫ぇ閮ㄥ垎鍔涢噺銆?..鍥犱負鎴戜滑瑕佺敤綾昏〃紺烘蹇碉紝闂灝卞彉鎴愪簡濡備綍鍘昏〃紺烘蹇典箣闂寸殑鍏崇郴銆傜劧鑰岋紝鎴戜滑鏃犳硶鍦ㄧ▼搴忚璦閲岃〃榪頒換鎰忕殑鍏崇郴銆傚嵆浣胯兘榪欐牱鍋氾紝鎴戜滑涔熸湭蹇呮兂鍘誨仛瀹冦傛垜浠殑綾誨簲璇ュ畾涔夊緱姣旀棩甯告蹇墊洿紿勪竴浜涒斺旇屼笖涔熸洿綺劇‘銆?#8221;
鎴戜滑鍙互浣撲細榪欐璇濈殑娣卞埢鎬с?/p>