Obsah:
- Krok 1: Vytvorte svoju triedu so súborom hlavičky a súborom CPP
- Krok 2: Nastavte konštruktor na súkromný
- Krok 3: Nastavte nástroj Destructor na hodnotu Private
- Krok 4: Vytvorenie premennej statického ukazovateľa v singlete
- Krok 5: Vytvorenie funkcie inštancie
- Krok 6: Vytváranie statických verejných funkcií
- Krok 7: Vytvorenie funkcie ukončenia
- Krok 8: Nastavenie PtrInstance na Nullptr
- Krok 9: Test a záver
Video: Ako urobiť vzor návrhu Singletonu v C ++: 9 krokov
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:59
Úvod:
Cieľom tejto inštrukčnej príručky je naučiť používateľa, ako implementovať vzor návrhu singletonu do svojho programu C ++. Pritom táto inštrukčná sada tiež čitateľovi vysvetlí, prečo sú prvky jednotlivca také, aké sú a ako je kód spracovaný. Vedieť to, pomôže v budúcnosti s ladením vašich budúcich singletonov. Aký je vzor dizajnu singletonu? Vzor návrhu singletonu je návrhový vzor, kde kodér vytvorí triedu, ktorú je možné vytvoriť iba raz, k verejným funkciám tried je možné v zásade pristupovať kdekoľvek, ak ste #zahrnuli súbor hlavičky do iných súborov súvisiacich s projektom.
Dizajnový vzor singleton je návrhový vzor, ktorý musí poznať každý objektovo orientovaný programátor, softvéroví programátori a herní programátori. Vzor návrhu singletonu je tiež jedným z najľahších vzorov kódovania, ktoré existujú. Naučiť sa to vám môže v budúcnosti pomôcť naučiť sa ďalšie, náročnejšie, návrhové vzorce. Môže vám tiež pomôcť zefektívniť kód vášho programu spôsobmi, o ktorých ste si nemysleli, že sú možné.
Aj keď je obtiažnosť vzorového vzoru singletonu v porovnaní s inými návrhovými vzormi ľahká, táto inštrukčná sada má stredné obtiažnosti. To znamená, že na vykonanie týchto pokynov vám odporúčame poznať základné a pokročilé požiadavky na syntax jazyka C ++. Mali by ste tiež poznať správnu etiketu kódovania C ++ (t. J. Ponechať premenné triedy v súkromí, jednu triedu na súbor hlavičky atď.). Tiež by ste mali vedieť, ako uvoľniť pamäť a ako konštruktory a deštruktory fungujú v C ++.
Tento návod trvá v priemere 10-15 minút.
Požiadavky na materiál:
-Počítač (môže byť PC alebo Mac), na ktorom je možné spustiť Visual Studios (akákoľvek verzia)
-Jednoduchý program vytvorený vo Visual Studios, s ktorým si môžete otestovať svoje singleton
Poznámka: Dizajnový vzor singletonu je možné vytvoriť na akomkoľvek inom IDE alebo kódovacom rozhraní podporujúcom C ++, ale pre túto sadu inštrukcií použijeme Visual Studios Enterprise Edition.
Krok 1: Vytvorte svoju triedu so súborom hlavičky a súborom CPP
Ak chcete vytvoriť tieto dva súbory a triedu naraz, otvorte svoj projekt / program v programe Visual Studios, prejdite na prieskumníka riešení, kliknite pravým tlačidlom myši a v blízkosti kurzora myši sa zobrazí pole, nájdite možnosť „Pridať“, umiestnite kurzor myši. nad ním a napravo by sa malo objaviť ďalšie pole. V tomto políčku chcete nájsť možnosť „Nová položka..“, kliknite na ňu a malo by sa objaviť okno, ktoré pripomína obrázok 1.1 nižšie. V tomto okne chcete vybrať „Trieda C ++“a potom kliknúť na „Pridať“. Otvorí sa ďalšie okno, ktoré sa podobá obrázku 1.2. V tomto okne zadáte názov svojej triedy do poľa „Class Name“a Visual Studios automaticky pomenuje skutočný súbor podľa názvu triedy. Na účely tejto inštrukcie pomenujeme našu triedu „EngineDebugSingleton“, ale môže to byť akékoľvek meno založené na písmenách. Teraz kliknite na „OK“a pokračujte krokom 2.
Poznámka: Prieskumník riešení a miesto, kde sú súbory uložené vo vašom počítači, sú oddelené. Presunutím alebo vytvorením čohokoľvek v Prieskumníkovi riešení sa nepresunú ani neusporiadajú súbory v rámci vášho prieskumníka súborov OS. Bezpečný spôsob usporiadania súborov na strane prieskumníka súborov by bolo odstránenie, ale nie odstránenie konkrétnych súborov z prieskumníka riešení, presunutie rovnakých súborov v Prieskumníkovi súborov na požadované miesto a návrat späť do prieskumníka riešení, pravým tlačidlom myši, nájdite možnosť „Pridať“, potom nájdite „Existujúcu položku“a nájdite súbory, ktoré ste presunuli. Presuňte súbor záhlavia aj súbor cpp.
Krok 2: Nastavte konštruktor na súkromný
Ak sa pri vašom novovytvorenom súbore CPP a hlavičkovom súbore automaticky neotvoril, prejdite na prieskumníka riešení a kliknite a otvorte „EngineDebugSingleton.h“. Potom vás privíta „EngineDebugSingleton ()“, predvolený konštruktor triedy a „~ EngineDebugSingleton ()“deštruktor triedy. V tomto kroku budeme chcieť nastaviť konštruktor na súkromný, to znamená, že táto funkcia je k dispozícii iba pre triedu a nič iné. Vďaka tomu nebudete môcť vytvárať premenné ani alokovať triedu do pamäte mimo triedu, iba v hlavičkovom súbore tried a ďalších funkciách tried. Súkromný staviteľ je kľúčom k návrhu a fungovaniu singletonov. V budúcich krokoch objavíme, ako sa vytvára inštancia singletonu a ako sa k nemu pristupuje.
Po presťahovaní konštruktéra do súkromia by trieda mala teraz vyzerať takto (Pozrite sa na pridruženú fotografiu)
Krok 3: Nastavte nástroj Destructor na hodnotu Private
Rovnako ako sme to urobili s konštruktérom v
krok 2, v tomto kroku teraz nastavíme deštruktor na súkromný. Rovnako ako v prípade konštruktora, nič, okrem samotnej triedy, nebude schopné odstrániť všetky premenné triedy z pamäte.
Po dokončení tohto kroku by trieda mala teraz vyzerať takto. (Pozrite si pridruženú fotografiu)
Krok 4: Vytvorenie premennej statického ukazovateľa v singlete
V tomto kroku vytvoríme a
statická premenná ukazovateľa typu „EngineDebugSingleton*“. Toto bude premenná, ktorá bude použitá alokovať náš singleton do pamäte a bude naň ukazovať po celý čas, kedy je náš singleton alokovaný do pamäte.
Takto by mal vyzerať náš hlavičkový súbor po vytvorení tejto premennej
Krok 5: Vytvorenie funkcie inštancie
Teraz chceme urobiť príklad
funkciu. Funkcia bude musieť byť statická a bude chcieť vrátiť odkaz na našu triedu („EngineDebugSingleton &“). Našu funkciu sme nazvali Instance (). V samotnej funkcii budeme chcieť najskôr otestovať, či ptrInstance == nullptr (dá sa skrátiť na! PtrInstance), ak je nullptr, znamená to, že singleton nebol alokovaný a v rozsahu príkazu if budeme chcete alokovať vykonaním ptrInstance = new EngineDebugSingleton (). Tu skutočne priradíte singleton do pamäte. Po opustení rozsahu príkazu if potom vrátime to, na čo ptrInstance ukazuje, čo je označené syntaxou „*ptrInstance“. Túto funkciu budeme veľmi používať pri vytváraní našich statických verejných funkcií, aby sme mohli skontrolovať, či bol singlet vytvorený a alokovaný do pamäte. Táto funkcia v podstate robí to, že môžete mať iba jedno pridelenie triedy a nie viac.
Takto by mala naša trieda vyzerať teraz po vytvorení funkcie Instance (). Ako vidíte, všetko, čo sme urobili, zostalo v súkromnej časti triedy, v nasledujúcich niekoľkých krokoch sa to trochu zmení.
Krok 6: Vytváranie statických verejných funkcií
Potom, čo ste vykonali funkciu z
krok 5, môžete začať vytvárať statické verejné funkcie. Každá verejná funkcia by mala mať súkromnú funkciu, názov tejto funkcie nemôže byť rovnaký. Prečo urobiť funkciu statickou? Verejné funkcie robíme statickými, aby k nim bol prístup bez skutočného objektu. Namiesto toho, aby sme urobili niečo ako „EngineDebugSingleObj-> SomeFunction ()“, urobíme „EngineDebugSingleton:: Some Function ()“. Vďaka tomu je k singletu prístupný v zásade kdekoľvek v kóde za predpokladu, že ste #zahrnuli súbor hlavičky do konkrétneho súboru projektu, s ktorým pracujete. S týmto môžete tiež vytvoriť singleton prostredníctvom ktorejkoľvek z jeho verejných funkcií.
Na tento účel sme v tomto kroku vytvorili dve verejné statické prázdne funkcie „add ()“a „subtract ()“. V súkromnej sekcii nájdete ďalšie dve funkcie „PrivAdd ()“a „PrivSubtract ()“. Tiež sme pridali premennú int s názvom „NumberOfThings“. Definícia týchto funkcií prejde do súboru CPP našich tried. Aby sa funkcia ľahko dostala do súboru CPP, pomocou kurzora zvýraznite funkciu, ktorá by mala mať pod sebou zelenú čiaru, a kliknite na položku „Vľavo ALT + ENTER“, čím získate možnosť vytvoriť definíciu v triede priradený súbor CPP. Pozrite si fotografiu 6.1, aby ste videli, ako by mal hlavičkový súbor vyzerať, a potom, čo vytvoríte všetky definície funkcií, by váš CPP mal vyzerať ako obrázok 6.2, okrem toho, že vaše definície funkcií nebudú obsahovať žiadny kód.
Teraz budete chcieť do definícií funkcií pridať rovnaký kód ako na fotografii 6.2. Ako už bolo uvedené, naše verejné funkcie budú používať funkciu Instance (), ktorá vráti to, na čo ptrInstance ukazuje. To nám umožňuje prístup k súkromným funkciám našej triedy. Pri akejkoľvek verejnej funkcii jednotlivca by ste mali volať iba túto funkciu inštancie. Jedinou výnimkou z tohto je naša funkcia Ukončiť.
Poznámka: Presné verejné a súkromné funkcie zobrazené v tomto kroku nie sú potrebné, v súkromnej funkcii môžete mať rôzne názvy funkcií a operácie, ale pre akýkoľvek typ verejnej funkcie by ste s ňou mali mať aj súkromnú funkciu a verejná funkcia by mala vždy používať, v našom prípade, funkciu Instance ().
Krok 7: Vytvorenie funkcie ukončenia
Pretože v našej triede dokážeme vyhradiť náš singlet iba z pamäte, musíme vytvoriť statickú verejnú funkciu. Táto funkcia zavolá delete na ptrInstance, ktorá zavolá destruktor triedy a potom budeme chcieť nastaviť ptrInstance späť na nullptr, aby ju bolo možné znova priradiť, ak váš program nekončí. Tiež budete chcieť ukončiť svoje Singletony, aby ste vyčistili všetku alokovanú pamäť, ktorú ste alokovali v akýchkoľvek súkromných premenných Singleton.
Krok 8: Nastavenie PtrInstance na Nullptr
Na dokončenie singletonu chcete prejsť na súbor EngineDebugSingleton. CPP a v hornej časti súboru CPP, v našom prípade, zadajte „EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr“.
Týmto sa pôvodne nastaví ptrInstance na nullptr, takže keď prvýkrát prejdete inštančnou funkciou, našej triede bude možné priradiť do pamäte. Bez toho s najväčšou pravdepodobnosťou dostanete chybu, pretože sa pokúšate získať prístup k pamäti, ktorá k nej nemá nič priradené.
Krok 9: Test a záver
Teraz budeme chcieť otestovať, či náš singleton funguje, aby sme sa uistili, že bude fungovať. Bude to znamenať, že zavoláme verejné funkcie, ako je to popísané v kroku 6, a odporúčame vám nastaviť zarážky, aby ste prešli kódom a zistili, že singleton funguje ako to by malo byť. Náš východiskový bod bude v main.cpp nášho projektu a náš main.cpp teraz vyzerá ako na obrázku nižšie.
Gratulujem Práve ste dokončili svoju prvú implementáciu vzorového vzoru Singleton. S týmto návrhovým vzorom teraz môžete svoj kód zefektívniť rôznymi spôsobmi. Teraz napríklad môžete vytvoriť manažérske systémy, ktoré budú fungovať počas celého trvania programu, ku ktorým budete mať prístup prostredníctvom statických funkcií kdekoľvek, kam ste zaradili triedu.
Váš konečný súbor hlavičky by mal vyzerať ako na fotografii 7.1. Súbor CPP priradený k vášmu singletonu by mal vyzerať ako na fotografii 6.2 s pridaním kódu uvedeného v kroku 8 v hornej časti súboru. Tieto pokyny vám poskytli jednoduchú štruktúru vzorového vzoru Singleton.
Poradenstvo pri riešení problémov:
Zobrazujú sa chyby súvisiace s pamäťou?
Uistite sa, že ste sa obrátili na krok 7 a krok 8, aby ste sa uistili, že nastavujete ptrInstance na nullptr.
Vyskytuje sa nekonečná slučka?
Uistite sa, že pre verejné funkcie v ich definíciách voláte súkromnú funkciu, nie rovnakú verejnú funkciu.
Objekty pridelené v rámci singletonu, ktoré spôsobujú úniky pamäte?
Uistite sa, že vo svojom programovom kóde zavoláte funkciu ukončenia vášho singletonu, a v deštruktore vášho singletona uistite sa, že zrušíte alokáciu všetkých objektov, ktoré boli alokované do pamäte v rámci kódu singletonu.