Բովանդակություն:
- Քայլ 1: Ստեղծեք ձեր դասարանը ՝ վերնագրի ֆայլով և CPP ֆայլով
- Քայլ 2: Կոնստրուկտորը սահմանեք մասնավոր
- Քայլ 3: Կործանարարը սահմանեք մասնավոր
- Քայլ 4. Ստատիկ ցուցիչի փոփոխականի ստեղծում Singleton- ում
- Քայլ 5: Ատամի գործառույթի ստեղծում
- Քայլ 6. Ստատիկ հանրային գործառույթների ստեղծում
- Քայլ 7: Ստեղծեք դադարեցման գործառույթ
- Քայլ 8: PtrInstance- ի կարգավորումը Nullptr- ի վրա
- Քայլ 9: Թեստ և եզրակացություն
Video: Ինչպես անել Singleton- ի ձևավորման օրինակը C ++ - ում. 9 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:49
Ներածություն:
Այս հրահանգի նպատակը օգտագործողին սովորեցնելն է, թե ինչպես պետք է ներդնել միայնակ ձևավորման օրինակը իրենց C ++ ծրագրում: Դրանով այս հրահանգների հավաքածուն նաև կբացատրի ընթերցողին, թե ինչու են միայնակ տարրերն այնպիսին, ինչպիսին կան և ինչպես է մշակվում ծածկագիրը: Սա իմանալը ապագայում կօգնի ձեր ապագա միայնակներին կարգաբերել: Ո՞րն է միայնակ դիզայնի օրինակը: Singleton դիզայնի օրինակը դիզայնի օրինակ է, որտեղ ծածկագրողը ստեղծում է դաս, որը կարող է միայն մեկ անգամ հաստատվել, դասերի հանրային գործառույթներին հիմնականում կարելի է հասնել ցանկացած վայրում, պայմանով, որ նախագծի հետ կապված այլ ֆայլերում #ներառեք վերնագրի ֆայլը:
Մենավոր դիզայնի ձևը պարտադիր գիտելիքի ձևանմուշ է ցանկացած օբյեկտին ուղղված ծրագրավորողի, ծրագրային ապահովման ծրագրավորողների և խաղերի ծրագրավորողների համար: Մենավոր դիզայնի օրինակը նաև կոդավորման նախագծման ամենահեշտ ձևերից մեկն է: Այն սովորելը կարող է օգնել ձեզ սովորել այլ, ավելի դժվար, դիզայնի մոդելներ ապագայում: Այն կարող է նաև օգնել ձեզ ուղղել ձեր ծրագրի կոդը այն եղանակներով, որոնք հնարավոր չէիք համարում:
Թեև միայնակ դիզայնի ձևի դժվարությունը հեշտ է, երբ համեմատվում է դիզայնի այլ ձևերի հետ, այս հրահանգների հավաքածուն միջին դժվարություն ունի: Սա նշանակում է, որ այս ցուցումները կատարելու համար խորհուրդ ենք տալիս իմանալ C ++ - ի հիմնական և շարահյուսական պահանջները: Դուք նաև պետք է իմանաք C ++ ծածկագրման էթիկետը (այսինքն ՝ դասի փոփոխականները պահել գաղտնի, մեկ դաս ՝ վերնագրի ֆայլում և այլն): Դուք նաև պետք է իմանաք, թե ինչպես ազատել հիշողությունը և ինչպես են աշխատում կոնստրուկտորներն ու քայքայողները C ++ - ում:
Այս ուսուցողական ուղեցույցը միջինում կտևի մոտ 10-15 րոպե:
Նյութական պահանջներ
-Համակարգիչ (կարող է լինել համակարգիչ կամ Mac), որն ունակ է գործարկել Visual Studios (ցանկացած տարբերակ)
-Պարզ ծրագիր, որը ստեղծվել է Visual Studios- ում, որի միջոցով կարող եք փորձարկել ձեր միայնակությունը
Նշում. Մեկ դիզայնի օրինակը կարող է կատարվել ցանկացած այլ C ++ աջակցող IDE- ի կամ կոդավորման ինտերֆեյսի վրա, սակայն այս հրահանգների հավաքածուի համար մենք կօգտագործենք Visual Studios Enterprise Edition- ը:
Քայլ 1: Ստեղծեք ձեր դասարանը ՝ վերնագրի ֆայլով և CPP ֆայլով
Այս երկու ֆայլերը և դասարանը միանգամից ստեղծելու համար բացեք ձեր նախագիծը / ծրագիրը Visual Studios- ում, անցեք լուծումների հետազոտողին, աջ սեղմեք, և մկնիկի կուրսորի մոտ պետք է հայտնվի տուփ, գտեք «Ավելացնել» տարբերակը, սավառնել: դրա վրա, և մեկ այլ տուփ պետք է հայտնվի աջ կողմում: Այս վանդակում ցանկանում եք գտնել «Նոր տարր..» տարբերակը, կտտացրեք դրա վրա և պետք է հայտնվի պատուհան, որը նման է ստորև բերված լուսանկարին ՝ 1.1 պատկերին: Այս պատուհանում ցանկանում եք ընտրել «C ++ դաս», այնուհետև սեղմել «Ավելացնել»: Սա կբացի մեկ այլ պատուհան, որը նման է լուսանկարի 1.2 պատկերին: Այս պատուհանում «Դասի անուն» դաշտում մուտքագրում եք ձեր դասի անունը, և Visual Studios- ը ավտոմատ կերպով դասակարգում է իրական ֆայլը դասի անունից հետո: Այս հրահանգի նպատակով մենք պատրաստվում ենք մեր դասին անվանել «EngineDebugSingleton», բայց դա կարող է լինել ցանկացած տառի վրա հիմնված անուն: Այժմ կարող եք սեղմել «Լավ» և անցնել 2 -րդ քայլին:
Նշում. Լուծման հետազոտողը և այն վայրերը, որտեղ ֆայլերը պահվում են ձեր համակարգչում, առանձին են: Լուծման Explorer- ում որևէ բան տեղափոխելը կամ ստեղծելը չի տեղափոխի կամ կկազմակերպի ձեր OS ֆայլերի Explorer- ի ֆայլերը: Ֆայլերի հետազոտողի կողմից ձեր ֆայլերը կազմակերպելու անվտանգ միջոցը կլինի հեռացնել, բայց չջնջել լուծման Explorer- ի հատուկ ֆայլերը, ֆայլերի Explorer- ում նույն ֆայլերը տեղափոխել ցանկալի վայր, այնուհետև վերադառնալ լուծման Explorer- ին, աջ սեղմումով, գտեք «Ավելացնել» տարբերակը, այնուհետև գտեք «Առկա իրը» և գտեք ձեր տեղափոխած ֆայլերը: Համոզվեք, որ տեղափոխում եք ինչպես վերնագիրը, այնպես էլ cpp ֆայլը:
Քայլ 2: Կոնստրուկտորը սահմանեք մասնավոր
Ձեր նորաստեղծ CPP ֆայլով և վերնագրի ֆայլով, եթե այն ստեղծվելիս ինքնաբերաբար չի բացվել, գնացեք լուծումների հետազոտող և կտտացրեք և բացեք «EngineDebugSingleton.h»: Այնուհետև ձեզ կդիմավորեն «EngineDebugSingleton ()» - ով, դասի կանխադրված կոնստրուկտորով և «~ EngineDebugSingleton ()» դասի ավերիչով: Այս քայլի համար մենք կցանկանանք կոնստրուկտորը դնել մասնավորի վրա, սա նշանակում է, որ այս գործառույթը հասանելի է միայն դասին և ուրիշ ոչինչ: Դրանով դուք չեք կարողանա փոփոխական կատարել կամ դասը դասից դուրս հատկացնել հիշողությանը, միայն դասերի վերնագրի ֆայլում և դասերի այլ գործառույթներում: Կոնստրուկտորի մասնավոր լինելը բանալին է դիզայնի ձևի և այն բանի, թե ինչպես են գործում միայնակները: Մենք ապագա քայլերում կբացահայտենք, թե ինչպես է միայնակ մարդուն առաջարկվում և հասանելի:
Այժմ դասարանը պետք է այսպիսի տեսք ունենա ՝ կոնստրուկտորը մասնավոր տեղափոխելուց հետո (դիտեք համապատասխան լուսանկարը)
Քայլ 3: Կործանարարը սահմանեք մասնավոր
Ինչպես դա արեցինք ներսից կոնստրուկտորի հետ
քայլ 2, այս քայլի համար մենք այժմ ավերիչը կդարձնենք մասնավոր: Ինչպես կոնստրուկտորի դեպքում, ոչինչ, բացի դասից ինքնին, չի կարողանա ջնջել դասի ցանկացած փոփոխական հիշողությունից:
Այս քայլն ավարտելուց հետո դասարանն այժմ պետք է ունենա այս տեսքը: (Տես լուսանկարը)
Քայլ 4. Ստատիկ ցուցիչի փոփոխականի ստեղծում Singleton- ում
Այս քայլում մենք կստեղծենք ա
«EngineDebugSingleton*» տիպի ստատիկ ցուցիչի փոփոխական: Սա կլինի այն փոփոխականը, որը կօգտագործվի մեր singleton- ը հիշողությանը հատկացնելու համար և այն մատնանշելու է այն ամբողջ ժամանակ, երբ մեր singleton- ը հատկացվում է հիշողությանը:
Այսպիսին պետք է լինի մեր վերնագրի ֆայլը այս փոփոխականի ստեղծումից հետո
Քայլ 5: Ատամի գործառույթի ստեղծում
Այժմ մենք ուզում ենք օրինակ դարձնել
գործառույթը: Ֆունկցիան պետք է լինի ստատիկ գործառույթ և կցանկանա հղում վերադարձնել մեր դասին («EngineDebugSingleton &»): Մենք մեր գործառույթը կանչեցինք Instance (): Ֆունկցիայի մեջ մենք կցանկանանք նախ ստուգել, թե արդյոք ptrInstance == nullptr (կարող է կրճատվել. ցանկանում են հատկացնել ՝ կատարելով ptrInstance = new EngineDebugSingleton (): Սա այն է, որտեղ դուք իրականում հատկացնում եք միայնակին հիշողությանը: If հայտարարության շրջանակից դուրս գալուց հետո մենք կվերադառնանք այն, ինչ մատնանշում է ptrInstance- ը, որը նշվում է «*ptrInstance» շարահյուսությամբ: Այս ֆունկցիան մենք մեծապես կօգտագործենք մեր ստատիկ հանրային գործառույթները կատարելիս, այնպես որ կարող ենք ստուգել ՝ պարզելու համար, թե արդյոք ստեղծվել և հատկացվել է հիշողությանը: Ըստ էության, այս գործառույթը դարձնում է այն այնպես, որ դուք կարող եք ունենալ դասի միայն մեկ տեղաբաշխում և ոչ ավելին:
Ահա թե ինչպիսին պետք է լինի մեր դասարանը Instance () գործառույթը ստեղծելուց հետո: Ինչպես տեսնում եք, այն ամենը, ինչ մենք արել ենք, մնացել է դասի մասնավոր հատվածում, սա մի փոքր կփոխվի հաջորդ մի քանի քայլերում:
Քայլ 6. Ստատիկ հանրային գործառույթների ստեղծում
Գործողությունը կատարելուց հետո
քայլ 5, կարող եք սկսել կատարել ստատիկ հանրային գործառույթներ: Յուրաքանչյուր հանրային գործառույթ պետք է ունենա մասնավոր գործառույթ ՝ դրան զուգահեռ, այս գործառույթի անունը չի կարող նույնը լինել: Ինչու՞ գործառույթը դարձնել ստատիկ: Մենք հանրային գործառույթները դարձնում ենք ստատիկ, որպեսզի դրանք հասանելի լինեն առանց իրական օբյեկտի: Այսպիսով, «EngineDebugSingleObj-> SomeFunction ()»-ի նման բան անելու փոխարեն, մենք անում ենք «EngineDebugSingleton:: Some Function ()»: Սա հնարավորություն է տալիս միայնակ մարդու հասանելի լինել հիմնականում կոդի ցանկացած վայրում ՝ պայմանով, որ դուք #ներառել եք վերնագրի ֆայլը հատուկ նախագծի ֆայլում, որի հետ աշխատում եք: Դրանով դուք կարող եք նաև ստեղծել միայնակ իր ցանկացած հանրային գործառույթի միջոցով:
Մեր նպատակների համար այս քայլում մենք ստեղծեցինք երկու հանրային ստատիկ դատարկ գործառույթ ՝ «ավելացնել ()» և «հանել ()»: Անձնական բաժնում մենք ևս երկու գործառույթ ունենք ՝ «PrivAdd ()» և «PrivSubtract ()»: Մենք նաև ավելացրեցինք int փոփոխական, որը կոչվում է «NumberOfThings»: Այս գործառույթների սահմանումը կմտնի մեր դասարանների CPP ֆայլում: Որպեսզի գործառույթը հեշտությամբ մտնի CPP ֆայլի մեջ, ձեր կուրսորը նշեք այն գործառույթը, որի տակ պետք է լինի կանաչ տող, և սեղմեք «Left ALT + ENTER» ՝ այն կտա ձեզ տարբերակ սահմանելու մեջ: դասերի հետ կապված CPP ֆայլ: Տեսեք լուսանկար 6.1 -ը ՝ տեսնելու, թե ինչպիսին պետք է լինի վերնագրի ֆայլը, և բոլոր գործառույթների սահմանումները ստեղծելուց հետո ձեր CPP- ն պետք է նմանվի Ֆոտո 6.2 -ին, բացառությամբ, որ ձեր գործառույթների սահմանումները իրենց մեջ չունենան կոդ:
Այժմ դուք կցանկանաք ավելացնել նույն ծածկագիրը, ինչպես լուսանկար 6.2 -ում, ձեր գործառույթների սահմանումների մեջ: Ինչպես արդեն նշվեց, մեր հանրային գործառույթները կօգտագործեն Instance () գործառույթը, որը կվերադառնա այն, ինչին մատնանշում է ptrInstance- ը: Սա թույլ է տալիս մուտք գործել մեր դասի մասնավոր գործառույթներ: Singանկացած singleton- ի հանրային գործառույթով դուք պետք է զանգահարեք միայն այդ Instance գործառույթը: Սրանից միակ բացառությունը մեր Terminate գործառույթն է:
Նշում. Այս քայլում ցուցադրված ճշգրիտ հանրային և մասնավոր գործառույթներն անհրաժեշտ չեն, մասնավոր գործառույթում կարող եք ունենալ տարբեր գործառույթների անուններ և գործողություններ, բայց ցանկացած տեսակի հանրային գործառույթի համար պետք է ունենաք մասնավոր գործառույթ դրան զուգահեռ և հանրային գործառույթը միշտ պետք է օգտագործի, մեր դեպքում ՝ Instance () գործառույթը:
Քայլ 7: Ստեղծեք դադարեցման գործառույթ
Քանի որ մենք կարող ենք միայնակ մեր դասարանի հիշողությունից վերաբաշխել մեր դասարանը, մենք պետք է ստատիկ հանրային գործառույթ ստեղծենք: Այս գործառույթը կանչում է ջնջել ptrInstance- ում, որը կոչում է դասի ավերիչ, այնուհետև մենք կցանկանանք ptrInstance- ը վերադարձնել nullptr- ին, որպեսզի այն նորից հատկացվի, եթե ձեր ծրագիրը չավարտվի: Դուք նաև կցանկանաք դադարեցնել ձեր Singletons- ը ՝ մաքրելու ցանկացած հատկացված հիշողություն, որը հատկացրել եք Singleton- ի ցանկացած մասնավոր փոփոխականներում:
Քայլ 8: PtrInstance- ի կարգավորումը Nullptr- ի վրա
Ձեր միայնակությունը լրացնելու համար ցանկանում եք անցնել EngineDebugSingleton. CPP ֆայլին և CPP ֆայլի վերևում, մեր օրինակով, մուտքագրեք «EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr»:
Դա անելով ի սկզբանե ptrInstance- ը կդառնա nullptr, այնպես որ, երբ առաջին անգամ առաջին անգամ անցնեք օրինակ գործառույթը, մեր դասարանին թույլ կտրվի հատկացնել հիշողությանը: Առանց դրա, ամենայն հավանականությամբ, դուք սխալ կստանաք, քանի որ կփորձեք մուտք գործել հիշողություն, որն իրեն հատկացված ոչինչ չունի:
Քայլ 9: Թեստ և եզրակացություն
Այժմ մենք կցանկանանք ստուգել, որ մեր singleton- ը համոզված է, որ այն աշխատում է: Սա մեզ կներգրավի հանրային գործառույթներ, ինչպես նկարագրված է 6 -րդ քայլում, և մենք խորհուրդ ենք տալիս, որ դուք ստեղծեք ընդմիջման կետեր `ձեր կոդն անցնելու և տեսնելու համար, որ միայնակը գործում է որպես այն պետք է լինի: Մեր ելակետը լինելու է մեր նախագծի main.cpp- ում և մեր main.cpp- ն այժմ նման է ստորև ներկայացված պատկերին:
Շնորհավորում եմ: Դուք պարզապես ավարտել եք Singleton Design Pattern- ի ձեր առաջին իրականացումը: Այս դիզայնի օրինակով դուք այժմ կարող եք պարզեցնել ձեր ծածկագիրը տարբեր եղանակներով: Օրինակ, այժմ կարող եք կառավարիչ համակարգեր ստեղծել, որոնք գործում են ձեր ծրագրի գործարկման ընթացքում, որոնց կարելի է հասնել ստատիկ գործառույթների միջոցով `ցանկացած վայրում, որտեղ դուք ներառել եք դասը:
Ձեր վերջնական վերնագրի ֆայլը պետք է նման լինի լուսանկարին 7.1. Ձեր singleton- ի հետ կապված CPP ֆայլը պետք է նմանվի Լուսանկար 6.2 -ին ՝ ֆայլի վերևում ՝ 8 -րդ քայլում նշված կոդի ավելացմամբ: Այս հրահանգը ձեզ տրամադրեց Singleton Design Pattern- ի պարզ կառուցվածքը:
Անսարքությունների վերացման խորհուրդ
Հիշողության հետ կապված սխալնե՞ր եք ստանում:
Համոզվեք, որ հղում եք կատարում 7 -րդ և 8 -րդ քայլերին ՝ համոզվելու համար, որ ptrInstance- ը սահմանում եք nullptr:
Անսահման օղակ է առաջանում?
Համոզվեք, որ հանրային գործառույթները, իրենց բնորոշումներում, կոչում եք մասնավոր գործառույթ, այլ ոչ թե նույն հանրային գործառույթ:
Հիշողության արտահոսք առաջացնող սինգլետոնում տեղաբաշխված օբյեկտները:
Համոզվեք, որ անհրաժեշտության դեպքում կանչում եք ձեր singleton- ի դադարեցման գործառույթը, իսկ ձեր singleton- ի ապակառուցողի դեպքում `մեկանգամյա ծածկագրի սահմաններում հիշողությանը հատկացված բոլոր օբյեկտների ապաբաշխումը: