Kazalo:

Kako narediti enotni vzorec oblikovanja v C ++: 9 korakov
Kako narediti enotni vzorec oblikovanja v C ++: 9 korakov

Video: Kako narediti enotni vzorec oblikovanja v C ++: 9 korakov

Video: Kako narediti enotni vzorec oblikovanja v C ++: 9 korakov
Video: Написание 2D-игр на C с использованием SDL Томаса Лайвли 2024, Junij
Anonim
Kako narediti enotni vzorec oblikovanja v C ++
Kako narediti enotni vzorec oblikovanja v C ++

Uvod:

Namen tega priročnika je, da uporabnika nauči, kako implementirati enojni vzorec oblikovanja v svoj program C ++. Pri tem bo ta niz navodil bralcu tudi pojasnil, zakaj so elementi singletona takšni, kot so, in kako se koda obdeluje. Če to veste, boste v prihodnosti pomagali pri odpravljanju napak pri vaših bodočih samskih. Kakšen je vzorec enotnega oblikovanja? Enotonski vzorec oblikovanja je oblikovalni vzorec, kjer kodirnik ustvari razred, ki ga je mogoče namestiti le enkrat, do javnih funkcij razredov pa lahko v bistvu dostopate kjer koli, če ste datoteko z glavo vključili v druge datoteke, povezane s projektom.

Vzorec oblikovanja singleton je obvezen načrt oblikovanja za vsakega objektno naravnanega programerja, programerja in programerja iger. Vzorec enojnega oblikovanja je tudi eden najlažjih vzorcev oblikovanja kodiranja. Če se ga naučite, se lahko v prihodnosti naučite drugih, težjih oblikovalskih vzorcev. Prav tako vam lahko pomaga racionalizirati kodo vašega programa na načine, za katere menite, da to ni mogoče.

Čeprav je težava vzorca oblikovanja singletona enostavna v primerjavi z drugimi vzorci oblikovanja, ima ta niz navodil srednje težave. To pomeni, da za izvedbo teh navodil priporočamo, da poznate osnovne in napredne zahteve skladnje za C ++. Prav tako bi morali poznati pravilno oznako kodiranja C ++ (tj. Spremeniti spremenljivke razreda, en razred na datoteko z glavo itd.). Vedeti morate tudi, kako sprostiti pomnilnik in kako delujejo konstruktorji in destruktorji v C ++.

Ta navodila bodo v povprečju trajala približno 10-15 minut.

Materialne zahteve:

-Računalnik (lahko PC ali Mac), ki lahko izvaja Visual Studios (katera koli različica)

-Preprost program, ustvarjen v Visual Studiosu, s katerim lahko preizkusite svoj singleton

Opomba: Enotonski vzorec oblikovanja je mogoče narediti na katerem koli drugem C ++, ki podpira IDE ali kodirni vmesnik, vendar bomo za ta nabor navodil uporabljali Visual Studios Enterprise Edition.

1. korak: Ustvarite svoj razred z datoteko glave in datoteko CPP

Ustvarite svoj razred z datoteko glave in datoteko CPP
Ustvarite svoj razred z datoteko glave in datoteko CPP
Ustvarite svoj razred z datoteko glave in datoteko CPP
Ustvarite svoj razred z datoteko glave in datoteko CPP

Če želite ustvariti ti dve datoteki in razred naenkrat, odprite svoj projekt / program v Visual Studiosu, pojdite na raziskovalec rešitev, kliknite z desno miškino tipko in polje se mora prikazati blizu kazalca miške, poiščite možnost »Dodaj«, premaknite miškin kazalec nad njim, na desni pa bi se moralo prikazati drugo polje. V tem polju želite poiskati možnost »Nov element..«, kliknite nanjo in prikazalo se bo okno, ki spominja na spodnjo fotografijo 1.1. V tem oknu želite izbrati »Razred C ++« in nato pritisniti »Dodaj«. S tem se odpre drugo okno, ki je podobno sliki fotografije 1.2. V tem oknu vnesete ime razreda v polje »Ime razreda« in Visual Studios bo samodejno poimenoval dejansko datoteko po imenu razreda. Za namen tega navodila bomo razred poimenovali "EngineDebugSingleton", lahko pa je poljubno ime, ki temelji na črki. Zdaj lahko pritisnete »V redu« in nadaljujete na 2. koraku.

Opomba: Raziskovalec rešitev in mesto shranjevanja datotek v računalniku sta ločena. Premikanje ali ustvarjanje česar koli v raziskovalcu rešitev ne bo premaknilo ali organiziralo datotek v raziskovalcu datotek OS. Varen način za organiziranje datotek na strani raziskovalca datotek bi bil odstraniti, vendar ne izbrisati določenih datotek iz raziskovalca rešitev, premakniti iste datoteke v raziskovalcu datotek na želeno mesto in se nato vrniti v raziskovalec rešitev, z desno tipko miške kliknite, poiščite možnost »Dodaj«, nato »Obstoječi element« in poiščite datoteke, ki ste jih premaknili. Premikajte tako glavo kot datoteko cpp.

2. korak: Konstruktor nastavite na Zasebno

Konstruktor nastavite na Zasebno
Konstruktor nastavite na Zasebno

Če se na novo ustvarjena datoteka CPP in datoteka z glavo ne odpreta samodejno, ko ste jo ustvarili, pojdite v raziskovalec rešitev in kliknite in odprite »EngineDebugSingleton.h«. Nato vas bo pozdravil “EngineDebugSingleton ()”, privzeti konstruktor razreda in “~ EngineDebugSingleton ()” destruktor razreda. Za ta korak bomo želeli konstruktor nastaviti na zasebno, kar pomeni, da je ta funkcija na voljo samo razredu in nič drugega. S tem ne boste mogli narediti spremenljivke ali dodeliti razreda v pomnilnik zunaj razreda, samo v datoteki glave razreda in drugih funkcijah razredov. Zasebnost konstruktorja je ključna za vzorec oblikovanja in delovanje singletonov. V prihodnjih korakih bomo odkrili, kako se singleton ustvari in do njega dostopa.

Razred bi moral izgledati tako, potem ko je bil konstruktor premaknjen v zasebno (oglejte si povezano fotografijo)

3. korak: Destructor nastavite na Private

Destructor nastavite na Private
Destructor nastavite na Private

Tako kot smo to storili z konstruktorjem v

korak 2, za ta korak bomo destruktor postavili na zasebno. Tako kot pri konstruktorju ničesar razen razreda same ne bo mogoče izbrisati iz pomnilnika nobenih spremenljivk razreda.

Po zaključku tega koraka bi moral biti razred videti tako. (Glej pridruženo fotografijo)

4. korak: Ustvarjanje spremenljivke statičnega kazalca v Singletonu

Ustvarjanje spremenljivke statičnega kazalca v Singletonu
Ustvarjanje spremenljivke statičnega kazalca v Singletonu

V tem koraku bomo ustvarili datoteko

spremenljivka statičnega kazalca tipa “EngineDebugSingleton*”. To bo spremenljivka, ki bo uporabljena za dodelitev našega singletona pomnilniku in bo nanjo kazala ves čas, ko je naš singleton dodeljen pomnilniku.

Tako bi morala izgledati naša datoteka z glavo po ustvarjanju te spremenljivke

5. korak: Ustvarjanje funkcije primerka

Ustvarjanje funkcije primerka
Ustvarjanje funkcije primerka

Zdaj želimo narediti primerek

funkcijo. Funkcija bo morala biti statična in bo želela vrniti sklic na naš razred (“EngineDebugSingleton &”). Svojo funkcijo smo poklicali Instance (). V sami funkciji bomo najprej želeli preizkusiti, če je ptrInstance == nullptr (lahko skrajšamo na! PtrInstance), če je nullptr, to pomeni, da singleton ni bil dodeljen in v obsegu stavka if bomo želite dodeliti tako, da naredite ptrInstance = new EngineDebugSingleton (). Tukaj dejansko dodelite singleton v pomnilnik. Ko zapustimo obseg stavka if, bomo nato vrnili tisto, na kar kaže ptrInstance, kar je označeno s skladnjo »*ptrInstance«. To funkcijo bomo močno uporabljali pri izdelavi statičnih javnih funkcij, zato lahko preverimo, ali je singleton ustvarjen in dodeljen pomnilniku. V bistvu je zaradi te funkcije omogočena samo ena dodelitev razreda in ne več.

Tako bi moral izgledati naš razred po ustvarjanju funkcije Instance (). Kot lahko vidite, je vse, kar smo naredili, ostalo v zasebnem delu razreda, to se bo v naslednjih nekaj korakih nekoliko spremenilo.

6. korak: Ustvarjanje statičnih javnih funkcij

Ustvarjanje statičnih javnih funkcij
Ustvarjanje statičnih javnih funkcij
Ustvarjanje statičnih javnih funkcij
Ustvarjanje statičnih javnih funkcij
Ustvarjanje statičnih javnih funkcij
Ustvarjanje statičnih javnih funkcij

Ko funkcijo naredite iz

korak 5, lahko začnete izvajati statične javne funkcije. Vsaka javna funkcija mora imeti zasebno funkcijo, ki ji ustreza, ime te funkcije pa ne more biti enako. Zakaj bi bila funkcija statična? Ustvarjamo javne funkcije statične, da lahko do njih dostopate brez dejanskega predmeta. Namesto da naredimo nekaj takega kot »EngineDebugSingleObj-> SomeFunction ()«, naredimo »EngineDebugSingleton:: Some Function ()«. To omogoča dostop do singletona v bistvu kjer koli v kodi, pod pogojem, da ste #datoteko glave vključili v določeno datoteko projekta, s katero delate. S tem lahko singel ustvarite tudi prek katere koli njegove javne funkcije.

Za naše namene v tem koraku smo ustvarili dve javni statični funkciji void, “add ()” in “subtract ()”. V zasebnem razdelku imamo še dve funkciji, “PrivAdd ()” in “PrivSubtract ()”. Dodali smo tudi spremenljivko int, imenovano "NumberOfThings". Opredelitev teh funkcij bo v datoteki CPP naših razredov. Če želite, da funkcija zlahka vstopi v datoteko CPP, s kazalcem označite funkcijo, ki mora imeti pod njo zeleno črto, in pritisnete »Levo ALT + ENTER«, to vam bo omogočilo, da ustvarite definicijo v razredov povezana datoteka CPP. Oglejte si fotografijo 6.1, da vidite, kako naj bi izgledala datoteka z glavo, in potem, ko ustvarite vse definicije funkcij, mora biti vaš CPP videti kot fotografija 6.2, le da v definicijah vaših funkcij ne bo kode.

Zdaj boste želeli v definicije funkcij dodati isto kodo kot na fotografiji 6.2. Kot smo že omenili, bodo naše javne funkcije uporabljale funkcijo Instance (), ki bo vrnila tisto, na kar kaže ptrInstance. To nam omogoča dostop do zasebnih funkcij našega razreda. Pri kateri koli javni funkciji singletona bi morali klicati samo to funkcijo Instance. Edina izjema pri tem je naša funkcija Končaj.

Opomba: Natančne javne in zasebne funkcije, prikazane v tem koraku, niso potrebne, v zasebni funkciji imate lahko različna imena in operacije funkcij, toda za katero koli vrsto javne funkcije morate imeti zasebno funkcijo, ki ji ustreza. javna funkcija bi morala v našem primeru vedno uporabljati funkcijo Instance ().

7. korak: Ustvarjanje funkcije prekinitve

Ustvarjanje funkcije prekinitve
Ustvarjanje funkcije prekinitve
Ustvarjanje funkcije prekinitve
Ustvarjanje funkcije prekinitve

Ker lahko samostojno odstranimo iz spomina v svojem razredu, moramo ustvariti statično javno funkcijo. Ta funkcija bo poklicala delete pri ptrInstance, ki pokliče destruktor razreda, nato pa bomo želeli nastaviti ptrInstance nazaj na nullptr, tako da ga je mogoče znova dodeliti, če se vaš program ne konča. Prav tako boste želeli prekiniti Singletons, da počistite dodeljeni pomnilnik, ki ste ga dodelili v zasebnih spremenljivkah Singletona.

8. korak: Nastavitev PtrInstance na Nullptr

Nastavitev PtrInstance na Nullptr
Nastavitev PtrInstance na Nullptr

Če želite dokončati singleton, se pomaknite do datoteke EngineDebugSingleton. CPP in na vrhu datoteke CPP v našem primeru vnesite »EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr.«

S tem boste sprva nastavili ptrInstance na nullptr, zato bo ob prvem pregledu funkcije primerka naš razred dovoljeno dodeliti pomnilniku. Brez tega boste najverjetneje dobili napako, ker boste poskušali dostopati do pomnilnika, ki mu ni dodeljeno nič.

9. korak: Preizkus in zaključek

Preizkus in zaključek
Preizkus in zaključek

Zdaj bomo želeli preizkusiti naš singleton, da se prepričamo, da deluje. To bo vključevalo klic javnih funkcij, kot je opisano v 6. koraku, in priporočamo, da nastavite prelomne točke za prehod skozi vašo kodo in preverite, ali singleton deluje kot mora biti. Naše izhodišče bo v main.cpp našega projekta in naš main.cpp je zdaj videti kot spodnja slika.

Čestitamo! Pravkar ste dokončali svojo prvo implementacijo vzorca oblikovanja Singleton. S tem vzorcem oblikovanja lahko zdaj svojo kodo poenostavite na različne načine. Na primer, zdaj lahko naredite sisteme za upravljanje, ki delujejo v času izvajanja vašega programa, do katerih lahko dostopate s statičnimi funkcijami kjer koli, kjer ste vključili razred.

Vaša zadnja datoteka z glavo mora izgledati kot fotografija 7.1. Datoteka CPP vašega singletona bi morala izgledati kot fotografija 6.2 z dodatkom kode, prikazane v 8. koraku, na vrhu datoteke. To navodilo vam je dalo preprosto strukturo vzorca oblikovanja Singleton.

Nasveti za odpravljanje težav:

Ali prihaja do napak, povezanih s pomnilnikom?

Prepričajte se, da se sklicujete na 7. in 8. korak in se prepričajte, da nastavite ptrInstance na nullptr.

Prihaja do neskončne zanke?

Poskrbite, da za javne funkcije v njihovih definicijah kličete zasebno funkcijo, ne pa isto javno funkcijo.

Predmeti, dodeljeni znotraj singletona, povzročajo uhajanje pomnilnika?

Kadar je to primerno v programski kodi, pokličite funkcijo zaključevanja singletona in v destruktorju singletona prerazporedite vse predmete, ki so bili dodeljeni pomnilniku v obsegu singletonske kode.