Sisukord:

Singletoni disainimustri tegemine C ++ -is: 9 sammu
Singletoni disainimustri tegemine C ++ -is: 9 sammu

Video: Singletoni disainimustri tegemine C ++ -is: 9 sammu

Video: Singletoni disainimustri tegemine C ++ -is: 9 sammu
Video: САМОЕ ВАЖНОЕ видео на YouTube ... 2024, Juuni
Anonim
Kuidas teha Singletoni disainimustrit C ++ -is
Kuidas teha Singletoni disainimustrit C ++ -is

Sissejuhatus:

Selle kasutusjuhendi eesmärk on õpetada kasutajat, kuidas rakendada üksikut kujundusmustrit oma C ++ programmis. Seejuures selgitab see juhiste komplekt lugejale ka seda, miks üksiku elemendid on sellised, nagu nad on ja kuidas koodi töödeldakse. Selle teadmine aitab tulevikus teie tulevaste singlite silumisel. Milline on üksiku disaini muster? Üksiku kujunduse muster on kujundusmuster, kus kodeerija loob klassi, mida saab ainult üks kord instantseerida, klasside avalikele funktsioonidele on põhimõtteliselt juurdepääs kõikjal, eeldusel, et olete päisefaili lisanud teistesse projektiga seotud failidesse.

Üksiku disaini muster on igale objektorienteeritud programmeerijale, tarkvaraprogrammeerijale ja mänguprogrammeerijale vajalik disainimuster. Üksik kujundusmuster on ka üks lihtsamaid kodeerivaid disainimustreid. Selle õppimine võib aidata teil tulevikus õppida teisi, raskemaid disainimustreid. See võib aidata teil ka oma programmi koodi sujuvamaks muuta viisil, mida te ei pidanud võimalikuks.

Kuigi ühe kujundusmustri raskus on teiste kujundusmustritega võrreldes lihtne, on sellel juhendikomplektil keskmise raskusega. See tähendab, et nende juhiste tegemiseks soovitame teil teada C ++ põhilisi ja eelnevaid süntaksinõudeid. Samuti peaksite teadma õiget C ++ kodeerimise etiketti (st hoidke klassi muutujad privaatsena, üks klass päisefaili kohta jne). Samuti peaksite teadma, kuidas mälu vabastada ja kuidas konstruktorid ja hävitajad C ++ -is töötavad.

See juhend võtab keskmiselt umbes 10-15 minutit.

Materjali nõuded:

-Arvuti (võib olla arvuti või Mac), mis suudab käivitada Visual Studios (mis tahes versioon)

-Visual Studios loodud lihtne programm, millega saate oma üksikut katsetada

Märkus. Üksikut kujundusmustrit saab teha mis tahes muul C ++ toetaval IDE- või kodeerimisliidesel, kuid selle juhendi jaoks kasutame Visual Studios Enterprise Editionit.

Samm: looge oma klass päisefaili ja CPP -failiga

Looge oma klass päisefaili ja CPP -faili abil
Looge oma klass päisefaili ja CPP -faili abil
Looge oma klass päisefaili ja CPP -faili abil
Looge oma klass päisefaili ja CPP -faili abil

Nende kahe faili ja klassi korraga loomiseks avage Visual Studios oma projekt / programm, minge lahenduste uurija juurde, paremklõpsake ja hiirekursori lähedal peaks ilmuma kast, leidke valik „Lisa”, hõljutage kursorit selle kohal ja paremal peaks ilmuma teine kast. Selles kastis soovite leida valiku „Uus toode..”, klõpsake seda ja ilmub aken, mis sarnaneb alloleva foto 1.1 kujutisega. Selles aknas soovite valida "C ++ klass" ja seejärel vajutada "Lisa". See avab teise akna, mis sarnaneb foto 1.2 pildiga. Selles aknas sisestate väljale „Klassi nimi” oma klassi nime ja Visual Studios nimetab tegeliku faili automaatselt klassi nime järgi. Selle juhendi eesmärgil nimetame oma klassi „EngineDebugSingleton”, kuid see võib olla mis tahes tähepõhine nimi. Nüüd saate klõpsata nuppu „OK” ja jätkata sammuga 2.

Märkus. Lahenduste uurija ja failide arvutis hoidmise koht on eraldi. Lahenduste uurijas millegi teisaldamine või loomine ei teisalda ega korrasta teie OS -i failihalduris olevaid faile. Turvaline viis oma failide korraldamiseks failihalduri poolel oleks eemaldada, kuid mitte kustutada konkreetseid faile lahenduste uurijast, teisaldada samad failid failihalduris soovitud kohta ja seejärel minna tagasi lahenduste uurimisse, paremklõps, leidke suvand „Lisa”, seejärel leidke „Olemasolev üksus” ja leidke teisaldatud failid. Veenduge, et teisaldate nii päise kui ka cpp -faili.

Samm: seadke konstruktor privaatseks

Seadista konstruktor privaatseks
Seadista konstruktor privaatseks

Kui teie äsja loodud CPP -fail ja päisefail ei avane selle loomisel automaatselt, minge lahenduste uurijasse ja klõpsake ja avage „EngineDebugSingleton.h”. Seejärel tervitatakse teid "EngineDebugSingleton ()", klassi vaikekonstruktoriga ja "~ EngineDebugSingleton ()" klassi hävitajaga. Selle sammu jaoks tahame konstruktori seada privaatseks, see tähendab, et see funktsioon on saadaval ainult klassile ja mitte midagi muud. Sellega ei saa te muutujaid luua ega klassi klassivälisele mälule eraldada, ainult klasside päisefailis ja klasside muudes funktsioonides. Konstruktori privaatne olemasolu on projekteerimismustri ja üksikute toimimise võti. Avastame tulevastes sammudes, kuidas üksikut näidatakse ja sellele juurde pääseb.

Klass peaks nüüd välja nägema pärast konstruktori privaatseks teisaldamist (vaadake seotud fotot)

3. samm: määrake hävitaja privaatseks

Määrake hävitaja privaatseks
Määrake hävitaja privaatseks

Nagu tegime konstruktoriga

2. samm, selle sammu jaoks seadistame hävitaja nüüd privaatseks. Nagu konstruktori puhul, ei saa miski, välja arvatud klass ise, kustutada mälust klassi kõiki muutujaid.

Klass peaks nüüd pärast selle sammu lõpetamist välja nägema selline. (Vaata seotud fotot)

4. samm: staatilise osuti muutuja loomine singletonis

Staatilise osuti muutuja loomine singletonis
Staatilise osuti muutuja loomine singletonis

Selles etapis loome a

staatiline kursori muutuja tüüpi „EngineDebugSingleton*”. See on muutuja, mida kasutatakse, et eraldada meie üksikmälu mällu ja osutada sellele kogu meie üksiku mälule eraldamise ajaks.

Selline peaks meie päisefail pärast selle muutuja loomist välja nägema

5. samm: eksemplari funktsiooni loomine

Eksemplari funktsiooni loomine
Eksemplari funktsiooni loomine

Nüüd tahame teha näite

funktsiooni. Funktsioon peab olema staatiline ja soovib tagastada viite meie klassile („EngineDebugSingleton &”). Nimetasime oma funktsiooni Instance (). Funktsioonis endas tahame esmalt testida, kas ptrInstance == nullptr (saab lühendada! PtrInstance), kui see on nullptr, tähendab see, et üksikut pole eraldatud ja if -lause ulatuses soovite eraldada, tehes ptrInstance = new EngineDebugSingleton (). Siin eraldate üksiku mälule. Pärast if -lause ulatusest väljumist tagastame sellele, millele ptrInstance osutab, mida tähistab süntaks “*ptrInstance”. Kasutame seda funktsiooni avalike staatiliste funktsioonide tegemisel palju, et saaksime kontrollida, kas üksik on loodud ja mälule eraldatud. Sisuliselt muudab see funktsioon nii, et teil võib olla ainult üks klassijaotus ja mitte rohkem.

Selline peaks meie klass nüüd välja nägema pärast funktsiooni Instance () loomist. Nagu näete, on kõik see, mida oleme teinud, jäänud klassi privaatsesse sektsiooni, see muutub mõne järgmise sammu jooksul veidi.

6. samm: staatiliste avalike funktsioonide loomine

Staatiliste avalike funktsioonide loomine
Staatiliste avalike funktsioonide loomine
Staatiliste avalike funktsioonide loomine
Staatiliste avalike funktsioonide loomine
Staatiliste avalike funktsioonide loomine
Staatiliste avalike funktsioonide loomine

Pärast funktsiooni loomist

Samm 5, võite hakata tegema staatilisi avalikke funktsioone. Igal avalikul funktsioonil peaks olema kaasas privaatne funktsioon, selle funktsiooni nimi ei saa olla sama. Miks muuta funktsioon staatiliseks? Muudame avalikud funktsioonid staatiliseks, nii et neile pääseb juurde ilma tegeliku objektita. Nii et selle asemel, et teha midagi sellist nagu „EngineDebugSingleObj-> SomeFunction ()”, teeme „EngineDebugSingleton:: Some Function ()”. See võimaldab üksikjuurdepääsu põhimõtteliselt kõikjal koodis, eeldusel, et olete #kaasanud päisefaili konkreetsesse projektifaili, millega töötate. Selle abil saate luua ka üksiku selle avalike funktsioonide kaudu.

Selles etapis lõime oma eesmärgil kaks avalikku staatilist tühimiku funktsiooni: „add ()” ja „lahutama ()”. Privaatses jaotises on meil veel kaks funktsiooni, “PrivAdd ()” ja “PrivSubtract ()”. Lisasime ka int muutuja nimega “NumberOfThings”. Nende funktsioonide määratlus läheb meie klasside CPP -faili. Funktsiooni hõlpsaks sisestamiseks CPP -faili tõstate kursoriga esile funktsiooni, mille all peaks olema roheline joon, ja vajutate nuppu „Left ALT + ENTER”, see annab teile võimaluse luua definitsioon klasside seotud CPP -fail. Vaadake fotot 6.1, et näha, kuidas päisefail välja peaks nägema, ja pärast kõigi funktsioonide määratluste loomist peaks teie CPP välja nägema nagu foto 6.2, välja arvatud see, et teie funktsioonide definitsioonides pole koodi.

Nüüd soovite oma funktsioonide määratlustesse lisada sama koodi nagu fotol 6.2. Nagu varem öeldud, kasutavad meie avalikud funktsioonid funktsiooni Instance (), mis tagastab selle, millele ptrInstance osutab. See võimaldab meil pääseda ligi meie klassi privaatsetele funktsioonidele. Mis tahes üksiku avaliku funktsiooni puhul peaksite helistama ainult sellele eksemplari funktsioonile. Ainus erand sellest on meie lõpetamise funktsioon.

Märkus. Selles etapis näidatud täpsed avalikud ja privaatsed funktsioonid pole vajalikud, privaatses funktsioonis võivad teil olla erinevad funktsioonide nimed ja toimingud, kuid mis tahes tüüpi avalike funktsioonide puhul peaks teil olema kaasas privaatne funktsioon ja avalik funktsioon peaks alati kasutama meie puhul funktsiooni Instance ().

Samm 7: Lõpetamisfunktsiooni loomine

Funktsiooni Lõpetamine loomine
Funktsiooni Lõpetamine loomine
Funktsiooni Lõpetamine loomine
Funktsiooni Lõpetamine loomine

Kuna me saame oma üksikut ainult oma klassist mälust eraldada, peame looma staatilise avaliku funktsiooni. See funktsioon kutsub ptrInstance'i kustutama, mis kutsub klassi destrukteri, ja siis tahame määrata ptrInstance'i tagasi väärtusele nullptr, et seda saaks uuesti eraldada, kui teie programm ei lõpe. Samuti soovite lõpetada oma Singletonid, et puhastada eraldatud mälu, mille eraldasite Singletoni privaatsetes muutujates.

8. samm: seadistage PtrInstance väärtuseks Nullptr

Seadistage PtrInstance väärtuseks Nullptr
Seadistage PtrInstance väärtuseks Nullptr

Üksiku lõpuleviimiseks soovite minna faili EngineDebugSingleton. CPP ja sisestada CPP -faili ülaossa meie juhul „EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr”.

Seda tehes määratakse ptrInstance esialgu väärtuseks nullptr, nii et kui esimest korda eksemplari funktsiooni esimest korda läbite, lubatakse meie klass mälule eraldada. Ilma selleta saate tõenäoliselt vea, kuna proovite pääseda juurde mälule, millele pole midagi eraldatud.

9. samm: test ja järeldus

Test ja järeldus
Test ja järeldus

Nüüd tahame testida, kas meie üksiküksus töötab, veendumaks, et see töötab, see tähendab, et kutsume avalikke funktsioone, nagu on kirjeldatud punktis 6, ja soovitame teil seadistada katkestuspunktid, et oma kood läbi vaadata ja näha, kas üksik töötab see peaks olema. Meie lähtepunkt on meie projekti main.cpp ja meie main.cpp näeb nüüd välja nagu allolev pilt.

Palju õnne! Olete just lõpetanud Singletoni disainimustri esimese juurutamise. Selle kujundusmustri abil saate nüüd oma koodi mitmel viisil sujuvamaks muuta. Näiteks saate nüüd luua haldurisüsteeme, mis töötavad kogu teie programmi tööaja jooksul ja millele pääseb juurde staatiliste funktsioonide kaudu kõikjal, kuhu olete klassi lisanud.

Teie viimane päisefail peaks välja nägema nagu foto 7.1. Teie singletoniga seotud CPP -fail peaks välja nägema nagu foto 6.2, faili ülaosale on lisatud 8. etapis näidatud kood. See juhis andis teile lihtsa struktuuri Singletoni disainimustrist.

Tõrkeotsingu nõuanded:

Kas saate mäluga seotud vigu?

Vaadake kindlasti samme 7 ja 8, et veenduda, et seadistate ptrInstance väärtuseks nullptr.

Kas lõputu silmus tekib?

Veenduge, et avalike funktsioonide puhul kasutate nende määratlustes privaatset funktsiooni, mitte sama avalikku funktsiooni.

Üksikus eraldatud objektid põhjustavad mälulekkeid?

Veenduge, et helistate oma singletoni lõpetamise funktsioonile, kui see on teie programmikoodis asjakohane, ja veenduge oma singli hävitaja juures, et tühistate üksikute koodide piires mälule eraldatud objektide eraldamise.