Satura rādītājs:

Kā veikt Singleton dizaina modeli C ++: 9 soļi
Kā veikt Singleton dizaina modeli C ++: 9 soļi

Video: Kā veikt Singleton dizaina modeli C ++: 9 soļi

Video: Kā veikt Singleton dizaina modeli C ++: 9 soļi
Video: Рефакторинг: шаблон проектирования Singleton [Design Patterns] 2024, Jūnijs
Anonim
Kā izveidot Singleton dizaina modeli C ++
Kā izveidot Singleton dizaina modeli C ++

Ievads:

Šīs instrukcijas mērķis ir iemācīt lietotājam, kā C ++ programmā ieviest vienotā dizaina shēmu. To darot, šī instrukciju kopa lasītājam arī izskaidros, kāpēc atsevišķa elementa elementi ir tādi, kādi tie ir, un kā kods tiek apstrādāts. Zinot to, nākotnē palīdzēs atkļūdot jūsu nākamos singlus. Kāds ir vienīgais dizaina modelis? Vienīgais dizaina modelis ir dizaina modelis, kurā kodētājs izveido klasi, kuru var eksponēt tikai vienu reizi; klases publiskajām funkcijām būtībā var piekļūt jebkurā vietā, ja vien #esat iekļāvis galvenes failu citos ar projektu saistītos failos.

Vienīgais dizaina modelis ir jāzina dizaina paraugs jebkuram objektorientētam programmētājam, programmatūras programmētājam un spēļu programmētājam. Vienīgais dizaina modelis ir arī viens no vienkāršākajiem kodēšanas dizaina modeļiem. To apgūstot, nākotnē var palīdzēt apgūt citus, sarežģītākus dizaina modeļus. Tas var arī palīdzēt racionalizēt savas programmas kodu tādā veidā, kas, jūsuprāt, nebija iespējams.

Lai gan viena dizaina modeļa grūtības ir vienkāršas, salīdzinot ar citiem dizaina modeļiem, šim instrukciju komplektam ir vidējas grūtības. Tas nozīmē, ka, lai izpildītu šos norādījumus, iesakām zināt C ++ pamata un iepriekšējās sintakses prasības. Jums vajadzētu zināt arī pareizu C ++ kodēšanas etiķeti (t.i., saglabāt klases mainīgos privātus, vienu klasi galvenes failam utt.). Jums vajadzētu arī zināt, kā atbrīvot atmiņu un kā konstruktori un iznīcinātāji darbojas C ++.

Šī pamācība aizņems vidēji apmēram 10-15 minūtes.

Materiāla prasības:

-Dators (var būt dators vai Mac), kas spēj palaist Visual Studios (jebkura versija)

-Vienkārša programma, kas izveidota Visual Studios, ar kuru jūs varat pārbaudīt savu singlu

Piezīme. Vienīgo dizaina modeli var veikt jebkurā citā C ++ atbalstošā IDE vai kodēšanas saskarnē, taču šajā instrukciju komplektā mēs izmantosim Visual Studios Enterprise Edition.

1. darbība: izveidojiet savu klasi, izmantojot galvenes failu un CPP failu

Izveidojiet savu klasi, izmantojot galvenes failu un CPP failu
Izveidojiet savu klasi, izmantojot galvenes failu un CPP failu
Izveidojiet savu klasi, izmantojot galvenes failu un CPP failu
Izveidojiet savu klasi, izmantojot galvenes failu un CPP failu

Lai vienlaikus izveidotu šos divus failus un klasi, atveriet savu projektu / programmu Visual Studios, dodieties uz risinājumu pētnieku, ar peles labo pogu noklikšķiniet, un blakus peles kursoram vajadzētu parādīties lodziņam, atrodiet opciju “Pievienot”, virziet kursoru virs tā, un labajā pusē vajadzētu parādīties citam lodziņam. Šajā lodziņā vēlaties atrast opciju “Jauns vienums..”, noklikšķiniet uz tā un parādīsies logs, kas līdzinās zemāk redzamajam 1.1 fotoattēla attēlam. Šajā logā vēlaties atlasīt “C ++ klase” un pēc tam noklikšķiniet uz “Pievienot”. Tiks atvērts cits logs, kas līdzinās 1.2 fotoattēla attēlam. Šajā logā laukā “Klases nosaukums” ierakstiet savas klases nosaukumu, un Visual Studios automātiski nosauks faktisko failu pēc klases nosaukuma. Šīs instrukcijas nolūkā mēs savu klasi nosauksim par “EngineDebugSingleton”, taču tas var būt jebkurš uz burtiem balstīts nosaukums. Tagad varat nospiest “Labi” un turpināt 2. darbību.

Piezīme. Risinājumu pētnieks un vieta, kur faili tiek glabāti datorā, ir atsevišķi. Pārvietojot vai izveidojot kaut ko risinājumu pārlūkā, faili netiks pārvietoti vai sakārtoti jūsu OS failu pārlūkā. Drošs veids, kā sakārtot failus failu pārlūka pusē, būtu noņemt, bet neizdzēst konkrētos failus no risinājumu pārlūka, pārvietot tos pašus failus failu pārlūkā uz vēlamo vietu un pēc tam atgriezties risinājumu pārlūkā, ar peles labo pogu noklikšķiniet uz, atrodiet opciju “Pievienot”, pēc tam atrodiet “Esošais vienums” un atrodiet pārvietotos failus. Pārliecinieties, ka pārvietojat gan galveni, gan cpp failu.

2. darbība. Iestatiet konstruktoru uz Privāts

Iestatiet Konstruktoru uz Privāts
Iestatiet Konstruktoru uz Privāts

Ja jaunizveidotais CPP fails un galvenes fails netika atvērts automātiski, kad to izveidojāt, dodieties uz risinājumu pārlūku un noklikšķiniet uz un atveriet “EngineDebugSingleton.h”. Pēc tam jūs sagaidīs “EngineDebugSingleton ()”, klases noklusējuma konstruktors un “~ EngineDebugSingleton ()” klases iznīcinātājs. Šim solim mēs vēlēsimies konstruktoru iestatīt kā privātu, tas nozīmē, ka šī funkcija ir pieejama tikai klasei un nekas cits. Tādējādi jūs nevarēsit izveidot mainīgo vai piešķirt klasi atmiņai ārpus klases, tikai klases galvenes failā un citās klases funkcijās. Konstruktoru privātais ir galvenais, lai veidotu dizainu un kā darbojas vientuļnieki. Turpmākajos soļos mēs atklāsim, kā viens vienums tiek parādīts un tam pieejams.

Tagad pēc konstruktoru pārvietošanas uz privātu klasei vajadzētu izskatīties šādi (skatieties saistīto fotoattēlu)

3. darbība: iestatiet iznīcinātāju uz privātu

Iestatiet iznīcinātāju uz privātu
Iestatiet iznīcinātāju uz privātu

Tāpat kā mēs to darījām ar konstruktoru

solis, šim solim mēs tagad destruktoru iestatīsim kā privātu. Tāpat kā konstruktorā, nekas, izņemot pašu klasi, nevarēs izdzēst no atmiņas visus klases mainīgos.

Pēc šīs darbības pabeigšanas klasei tagad vajadzētu izskatīties šādi. (Skatīt saistīto fotoattēlu)

4. darbība. Statiskā rādītāja mainīgā izveide Singleton

Statiskā rādītāja mainīgā izveide singletonā
Statiskā rādītāja mainīgā izveide singletonā

Šajā solī mēs izveidosim a

statiskais rādītāja mainīgais tipa “EngineDebugSingleton*”. Tas būs mainīgais lielums, kas tiks izmantots, lai piešķirtu mūsu vienīgo atmiņai un norādītu uz to visu laiku, kad mūsu vienīgais ir piešķirts atmiņai.

Šādam vajadzētu izskatīties mūsu galvenes failam pēc šī mainīgā izveidošanas

5. darbība: instances funkcijas izveide

Instances funkcijas izveide
Instances funkcijas izveide

Tagad mēs vēlamies izveidot piemēru

funkciju. Funkcijai būs jābūt statiskai funkcijai, un tā vēlēsies atgriezt atsauci uz mūsu klasi (“EngineDebugSingleton &”). Mēs nosaucām savu funkciju par instanci (). Pašā funkcijā mēs vispirms vēlēsimies pārbaudīt, vai ptrInstance == nullptr (to var saīsināt līdz! PtrInstance), ja tas ir nullptr, tas nozīmē, ka vienīgais nav piešķirts, un if paziņojuma ietvaros mēs vēlaties piešķirt, veicot ptrInstance = new EngineDebugSingleton (). Šeit jūs faktiski piešķirat singlu atmiņai. Pēc iziešanas no if darbības jomas mēs atgriezīsim to, uz ko norāda ptrInstance, ko apzīmē ar sintaksi “*ptrInstance”. Veicot savas statiskās publiskās funkcijas, mēs ļoti izmantosim šo funkciju, lai mēs varētu pārbaudīt, vai vienīgais ir izveidots un piešķirts atmiņai. Būtībā šī funkcija ļauj jums iegūt tikai vienu klases iedalījumu un ne vairāk.

Šādi vajadzētu izskatīties mūsu klasei pēc funkcijas Instance () izveides. Kā redzat, viss mūsu paveiktais ir palicis klases privātajā sadaļā, turpmākajos soļos tas nedaudz mainīsies.

6. darbība: statisku publisku funkciju izveide

Statisku publisku funkciju izveide
Statisku publisku funkciju izveide
Statisku publisku funkciju izveide
Statisku publisku funkciju izveide
Statisku publisku funkciju izveide
Statisku publisku funkciju izveide

Kad esat izveidojis funkciju no

soli, jūs varat sākt veikt statiskas publiskas funkcijas. Katrai publiskai funkcijai ir jābūt privātai funkcijai, un tās nosaukums nevar būt vienāds. Kāpēc funkciju padarīt statisku? Mēs padarām publiskās funkcijas statiskas, lai tām varētu piekļūt bez faktiska objekta. Tā vietā, lai darītu kaut ko līdzīgu “EngineDebugSingleObj-> SomeFunction ()”, mēs darām “EngineDebugSingleton:: Some Function ()”. Tas ļauj atsevišķam vienumam piekļūt būtībā jebkurā koda vietā, ja vien #esat iekļāvis galvenes failu konkrētajā projekta failā, ar kuru strādājat. Ar to jūs varat arī izveidot singlu, izmantojot jebkuru tā publisko funkciju.

Šajā nolūkā mēs izveidojām divas publiskas statiskas tukšuma funkcijas - “pievienot ()” un “atņemt ()”. Privātajā sadaļā mēs izmantojam vēl divas funkcijas - “PrivAdd ()” un “PrivSubtract ()”. Mēs arī pievienojām int mainīgo ar nosaukumu “NumberOfThings”. Šo funkciju definīcija tiks iekļauta mūsu klases CPP failā. Lai funkcija viegli iekļūtu CPP failā, ar kursoru iezīmējiet funkciju, kurai jābūt zem zaļas līnijas, un nospiediet “Pa kreisi ALT + ENTER”, tā dos jums iespēju izveidot definīciju klases saistīto CPP failu. Skatiet 6.1. Fotoattēlu, lai redzētu, kā galvenes failam vajadzētu izskatīties, un pēc visu funkciju definīciju izveides jūsu CPP jāizskatās kā 6.2. Fotoattēlā, izņemot to, ka jūsu funkciju definīcijās nebūs koda.

Tagad funkciju definīcijās vēlaties pievienot to pašu kodu, kas attēlā 6.2. Kā minēts iepriekš, mūsu publiskās funkcijas izmantos funkciju Instance (), kas atgriezīs to, uz ko norāda ptrInstance. Tas ļauj mums piekļūt mūsu klases privātajām funkcijām. Izmantojot jebkuru atsevišķu publisku funkciju, jums vajadzētu izsaukt tikai šo gadījuma funkciju. Vienīgais izņēmums ir mūsu funkcija Izbeigt.

Piezīme. Precīzas publiskās un privātās funkcijas, kas parādītas šajā solī, nav nepieciešamas, jums var būt dažādi funkciju nosaukumi un darbības privātajā funkcijā, taču jebkura veida publiskām funkcijām jums ir jābūt privātai funkcijai un publiskajai funkcijai vienmēr vajadzētu izmantot mūsu gadījumā funkciju Instance ().

7. darbība: izbeigšanas funkcijas izveide

Funkcijas izbeigšana izveide
Funkcijas izbeigšana izveide
Funkcijas izbeigšana izveide
Funkcijas izbeigšana izveide

Tā kā savu vienīgo no savas atmiņas varam pārvietot tikai savā klasē, mums ir jāizveido statiska publiska funkcija. Šī funkcija izsauks dzēšanu ptrInstance, kas izsauc klases iznīcinātāju, un pēc tam mēs vēlēsimies iestatīt ptrInstance atpakaļ uz nullptr, lai to varētu atkal piešķirt, ja jūsu programma nebeidzas. Jūs arī vēlaties pārtraukt savus singletonus, lai iztīrītu visu piešķirto atmiņu, ko esat piešķīris jebkuros Singleton privātajos mainīgajos.

8. darbība: iestatiet PtrInstance uz Nullptr

PtrInstance iestatīšana uz Nullptr
PtrInstance iestatīšana uz Nullptr

Lai pabeigtu savu singlu, vēlaties pāriet uz failu EngineDebugSingleton. CPP un CPP faila augšdaļā, mūsu gadījumā, ierakstiet “EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr.”

Šādi rīkojoties, sākotnēji ptrInstance tiks iestatīts uz nullptr, tādēļ, pirmo reizi izmantojot instanču funkciju, mūsu klasei tiks atļauts piešķirt atmiņu. Bez tā jūs, visticamāk, saņemsit kļūdu, jo mēģināsit piekļūt atmiņai, kurai nekas nav piešķirts.

9. darbība. Pārbaude un secinājumi

Pārbaude un secinājumi
Pārbaude un secinājumi

Tagad mēs vēlēsimies pārbaudīt, vai mūsu atsevišķais vienums darbojas, un tas nozīmē, ka mēs izsauksim publiskās funkcijas, kā aprakstīts 6. darbībā, un mēs iesakām iestatīt pārtraukuma punktus, lai izietu cauri savam kodam un pārliecinātos, ka vienīgais darbojas kā tam vajadzētu būt. Mūsu sākumpunkts būs mūsu projekta main.cpp, un mūsu main.cpp tagad izskatās kā zemāk redzamais attēls.

Apsveicam! Jūs tikko esat pabeidzis pirmo Singleton dizaina modeļa ieviešanu. Izmantojot šo dizaina modeli, tagad varat racionalizēt savu kodu dažādos veidos. Piemēram, tagad varat izveidot pārvaldnieka sistēmas, kas darbojas visā jūsu programmas darbības laikā, un kurām var piekļūt, izmantojot statiskās funkcijas jebkurā vietā, kur esat iekļāvis klasi.

Jūsu pēdējam galvenes failam vajadzētu izskatīties kā fotoattēlā 7.1. Jūsu singleton saistītajam CPP failam vajadzētu izskatīties kā 6.2. Fotoattēlam, faila augšdaļā pievienojot 8. darbībā parādīto kodu. Šī instrukcija nodrošināja vienkāršu Singleton Design Pattern struktūru.

Ieteikumi problēmu novēršanai:

Vai rodas ar atmiņu saistītas kļūdas?

Noteikti skatiet 7. un 8. darbību, lai pārliecinātos, ka iestatāt ptrInstance uz nullptr.

Notiek bezgalīga cilpa?

Pārliecinieties, ka publiskajām funkcijām to definīcijās tiek izsaukta privātā funkcija, nevis tā pati publiskā funkcija.

Atsevišķos objektos piešķirtie objekti izraisa atmiņas noplūdi?

Noteikti izsauciet vienatnes izbeigšanas funkciju, ja tas ir paredzēts jūsu programmas kodā, un singla iznīcinātājā noteikti atdaliet visus objektus, kas tika piešķirti atmiņai vienotā koda ietvaros.