Բովանդակություն:

Ինչպես անել Singleton- ի ձևավորման օրինակը C ++ - ում. 9 քայլ
Ինչպես անել Singleton- ի ձևավորման օրինակը C ++ - ում. 9 քայլ

Video: Ինչպես անել Singleton- ի ձևավորման օրինակը C ++ - ում. 9 քայլ

Video: Ինչպես անել Singleton- ի ձևավորման օրինակը C ++ - ում. 9 քայլ
Video: SCP-1461 տուն է Worm (Object Class: Euclid) 2024, Հունիսի
Anonim
Ինչպես անել Singleton- ի ձևավորման օրինակը C ++ - ում
Ինչպես անել Singleton- ի ձևավորման օրինակը C ++ - ում

Ներածություն:

Այս հրահանգի նպատակը օգտագործողին սովորեցնելն է, թե ինչպես պետք է ներդնել միայնակ ձևավորման օրինակը իրենց C ++ ծրագրում: Դրանով այս հրահանգների հավաքածուն նաև կբացատրի ընթերցողին, թե ինչու են միայնակ տարրերն այնպիսին, ինչպիսին կան և ինչպես է մշակվում ծածկագիրը: Սա իմանալը ապագայում կօգնի ձեր ապագա միայնակներին կարգաբերել: Ո՞րն է միայնակ դիզայնի օրինակը: Singleton դիզայնի օրինակը դիզայնի օրինակ է, որտեղ ծածկագրողը ստեղծում է դաս, որը կարող է միայն մեկ անգամ հաստատվել, դասերի հանրային գործառույթներին հիմնականում կարելի է հասնել ցանկացած վայրում, պայմանով, որ նախագծի հետ կապված այլ ֆայլերում #ներառեք վերնագրի ֆայլը:

Մենավոր դիզայնի ձևը պարտադիր գիտելիքի ձևանմուշ է ցանկացած օբյեկտին ուղղված ծրագրավորողի, ծրագրային ապահովման ծրագրավորողների և խաղերի ծրագրավորողների համար: Մենավոր դիզայնի օրինակը նաև կոդավորման նախագծման ամենահեշտ ձևերից մեկն է: Այն սովորելը կարող է օգնել ձեզ սովորել այլ, ավելի դժվար, դիզայնի մոդելներ ապագայում: Այն կարող է նաև օգնել ձեզ ուղղել ձեր ծրագրի կոդը այն եղանակներով, որոնք հնարավոր չէիք համարում:

Թեև միայնակ դիզայնի ձևի դժվարությունը հեշտ է, երբ համեմատվում է դիզայնի այլ ձևերի հետ, այս հրահանգների հավաքածուն միջին դժվարություն ունի: Սա նշանակում է, որ այս ցուցումները կատարելու համար խորհուրդ ենք տալիս իմանալ C ++ - ի հիմնական և շարահյուսական պահանջները: Դուք նաև պետք է իմանաք C ++ ծածկագրման էթիկետը (այսինքն ՝ դասի փոփոխականները պահել գաղտնի, մեկ դաս ՝ վերնագրի ֆայլում և այլն): Դուք նաև պետք է իմանաք, թե ինչպես ազատել հիշողությունը և ինչպես են աշխատում կոնստրուկտորներն ու քայքայողները C ++ - ում:

Այս ուսուցողական ուղեցույցը միջինում կտևի մոտ 10-15 րոպե:

Նյութական պահանջներ

-Համակարգիչ (կարող է լինել համակարգիչ կամ Mac), որն ունակ է գործարկել Visual Studios (ցանկացած տարբերակ)

-Պարզ ծրագիր, որը ստեղծվել է Visual Studios- ում, որի միջոցով կարող եք փորձարկել ձեր միայնակությունը

Նշում. Մեկ դիզայնի օրինակը կարող է կատարվել ցանկացած այլ C ++ աջակցող IDE- ի կամ կոդավորման ինտերֆեյսի վրա, սակայն այս հրահանգների հավաքածուի համար մենք կօգտագործենք Visual Studios Enterprise Edition- ը:

Քայլ 1: Ստեղծեք ձեր դասարանը ՝ վերնագրի ֆայլով և CPP ֆայլով

Ստեղծեք ձեր դասարանը ՝ վերնագրի ֆայլով և CPP ֆայլով
Ստեղծեք ձեր դասարանը ՝ վերնագրի ֆայլով և CPP ֆայլով
Ստեղծեք ձեր դասարանը ՝ վերնագրի ֆայլով և CPP ֆայլով
Ստեղծեք ձեր դասարանը ՝ վերնագրի ֆայլով և 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- ում

Ստեղծող ցուցիչի փոփոխականի ստեղծում Singleton- ում
Ստեղծող ցուցիչի փոփոխականի ստեղծում 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- ի վրա

PtrInstance- ի կարգավորումը Nullptr- ի վրա
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- ի ապակառուցողի դեպքում `մեկանգամյա ծածկագրի սահմաններում հիշողությանը հատկացված բոլոր օբյեկտների ապաբաշխումը: