Sisällysluettelo:

Kuinka tehdä Singletonin suunnittelumalli C ++: ssa: 9 vaihetta
Kuinka tehdä Singletonin suunnittelumalli C ++: ssa: 9 vaihetta

Video: Kuinka tehdä Singletonin suunnittelumalli C ++: ssa: 9 vaihetta

Video: Kuinka tehdä Singletonin suunnittelumalli C ++: ssa: 9 vaihetta
Video: Больше, чем кофе: внутренняя работа интервью 2024, Kesäkuu
Anonim
Kuinka tehdä Singletonin suunnittelumalli C ++: ssa
Kuinka tehdä Singletonin suunnittelumalli C ++: ssa

Johdanto:

Tämän oppaan tarkoituksena on opettaa käyttäjälle, kuinka toteuttaa yksittäinen suunnittelumalli C ++ -ohjelmassaan. Tällöin tämä ohjejoukko selittää myös lukijalle, miksi yksittäisen elementit ovat sellaisia kuin ne ovat ja miten koodi käsitellään. Tämän tietäminen auttaa tulevaisuudessa tulevien singletiesi virheenkorjauksessa. Mikä on yksittäinen suunnittelumalli? Yksittäinen suunnittelumalli on suunnittelumalli, jossa kooderi luo luokan, joka voidaan luoda vain kerran. Luokkien julkiset toiminnot ovat pääsääntöisesti käytettävissä missä tahansa, jos olet sisällyttänyt otsikkotiedoston muihin projektiin liittyviin tiedostoihin.

Yksittäinen suunnittelumalli on välttämätön suunnittelumalli mille tahansa olio-ohjelmoijalle, ohjelmisto-ohjelmoijalle ja peliohjelmoijalle. Yksittäinen suunnittelukuvio on myös yksi helpoimmista koodaavista suunnittelumalleista. Sen oppiminen voi auttaa sinua oppimaan muita, vaikeampia suunnittelumalleja tulevaisuudessa. Se voi myös auttaa sinua virtaviivaistamaan ohjelmasi koodia tavoilla, joita et pitänyt mahdollisina.

Vaikka yksittäisen suunnittelumallin vaikeus on helppoa verrattuna muihin suunnittelumalleihin, tällä ohjejoukolla on keskivaikeus. Tämä tarkoittaa, että näiden ohjeiden suorittamiseksi suosittelemme, että tunnet C ++: n perus- ja syntaksivaatimukset. Sinun pitäisi myös tietää oikea C ++ -koodausetiketti (eli pitää luokan muuttujat yksityisinä, yksi luokka per otsikkotiedosto jne.). Sinun pitäisi myös tietää, kuinka vapauttaa muistia ja kuinka konstruktorit ja tuhoajat toimivat C ++: ssa.

Tämä opas kestää keskimäärin noin 10-15 minuuttia.

Materiaalivaatimukset:

-Tietokone (voi olla PC tai Mac), joka pystyy käyttämään Visual Studiosia (mikä tahansa versio)

-Yksinkertainen ohjelma, joka on luotu Visual Studiosissa ja jolla voit testata singletoniasi

Huomautus: Yksittäinen suunnittelumalli voidaan tehdä millä tahansa muulla C ++: n tukevalla IDE- tai koodausrajapinnalla, mutta tässä ohjeessa käytämme Visual Studios Enterprise Editionia.

Vaihe 1: Luo luokka otsikkotiedostolla ja CPP -tiedostolla

Luo luokka otsikkotiedostolla ja CPP -tiedostolla
Luo luokka otsikkotiedostolla ja CPP -tiedostolla
Luo luokka otsikkotiedostolla ja CPP -tiedostolla
Luo luokka otsikkotiedostolla ja CPP -tiedostolla

Jos haluat luoda nämä kaksi tiedostoa ja luokan kerralla, avaa projekti / ohjelma Visual Studiosissa, siirry ratkaisututkijaan, napsauta hiiren kakkospainikkeella ja hiiren osoittimen lähellä oleva ruutu tulee näkyviin, etsi vaihtoehto "Lisää", vie hiiri sen yläpuolelle, ja toisen ruudun pitäisi näkyä oikealla. Tässä ruudussa haluat löytää vaihtoehdon "Uusi kohde..", napsauta sitä ja alla olevan valokuvan 1.1 kuvan kaltainen ikkuna tulee näkyviin. Tässä ikkunassa haluat valita "C ++ -luokan" ja paina sitten "Lisää". Tämä avaa toisen ikkunan, joka muistuttaa valokuvan 1.2 kuvaa. Tässä ikkunassa kirjoitat luokkasi nimen "Luokan nimi" -kenttään ja Visual Studios nimeää todellisen tiedoston automaattisesti luokan nimen jälkeen. Tätä ohjetta varten aiomme nimetä luokkamme "EngineDebugSingleton", mutta se voi olla mikä tahansa kirjaimiin perustuva nimi. Voit nyt painaa”OK” ja siirtyä vaiheeseen 2.

Huomautus: Ratkaisut ja tiedostojen säilytyspaikka tietokoneellasi ovat erilliset. Siirtäminen tai luominen ratkaisutyökalussa ei siirrä tai järjestä tiedostoja käyttöjärjestelmän tiedostojenhallintaohjelmassa. Turvallinen tapa järjestää tiedostosi tiedostonhallintapuolella olisi poistaa, mutta ei poistaa tiettyjä tiedostoja ratkaisututkimuksesta, siirtää samat tiedostot tiedostonhallinnassa haluttuun paikkaan ja palata sitten ratkaisututkijaan, napsauta hiiren kakkospainikkeella, Etsi vaihtoehto "Lisää", sitten "Olemassa oleva kohde" ja etsi siirretyt tiedostot. Muista siirtää sekä otsikko- että cpp -tiedosto.

Vaihe 2: Aseta konstruktori yksityiseksi

Aseta Constructor yksityiseksi
Aseta Constructor yksityiseksi

Jos uusi CPP -tiedosto ja otsikkotiedosto eivät avautuneet automaattisesti, kun luot ne, siirry ratkaisututkijaan ja napsauta ja avaa "EngineDebugSingleton.h". Sitten sinut tervehditään "EngineDebugSingleton ()", luokan oletusrakentaja ja "~ EngineDebugSingleton ()" luokan tuhoaja. Tässä vaiheessa haluamme asettaa konstruktorin yksityiseksi, mikä tarkoittaa, että tämä toiminto on vain luokan käytettävissä eikä mikään muu. Tämän avulla et voi tehdä muuttujaa tai jakaa luokkaa luokan ulkopuoliseen muistiin vain luokkien otsikkotiedostossa ja luokkien muissa toiminnoissa. Rakentajan yksityisyys on avain suunnittelumalliin ja yksittäisten toimimiseen. Selvitämme tulevissa vaiheissa, kuinka yksittäinen kappale näytetään ja sitä käytetään.

Luokan pitäisi nyt näyttää tältä, kun konstruktori on siirretty yksityiseksi (katso siihen liittyvää kuvaa)

Vaihe 3: Aseta tuhoaja yksityiseksi

Aseta tuhoaja yksityiseksi
Aseta tuhoaja yksityiseksi

Kuten teimme rakentajan kanssa

Vaihe 2, tässä vaiheessa asetamme tuhoajan yksityiseksi. Kuten rakentaja, mikään muu kuin luokka itse ei voi poistaa luokan muuttujia muistista.

Luokan pitäisi nyt näyttää tältä tämän vaiheen suorittamisen jälkeen. (Katso liitetty kuva)

Vaihe 4: Staattisen osoitinmuuttujan luominen Singletoniin

Staattisen osoitinmuuttujan luominen Singletoniin
Staattisen osoitinmuuttujan luominen Singletoniin

Tässä vaiheessa luomme

staattinen osoitinmuuttuja, jonka tyyppi on “EngineDebugSingleton*”. Tämä on muuttuja, jota käytetään allokoimaan singletin muistille ja osoittamaan sitä koko ajan, jolloin singleton on varattu muistille.

Tältä otsikkotiedostomme pitäisi näyttää tämän muuttujan luomisen jälkeen

Vaihe 5: Instanssitoiminnon luominen

Instanssitoiminnon luominen
Instanssitoiminnon luominen

Haluamme nyt tehdä esimerkin

toiminto. Funktion on oltava staattinen funktio ja se haluaa palauttaa viittauksen luokkaan (“EngineDebugSingleton &”). Kutsuimme toimintoamme Instance (). Itse funktiossa haluamme ensin testata, onko ptrInstance == nullptr (voidaan lyhentää muotoon! PtrInstance), jos se on nullptr, tämä tarkoittaa, että yksittäistä ei ole allokoitu, ja if -lauseen haluat allokoida tekemällä ptrInstance = new EngineDebugSingleton (). Tässä kohdennat yksittäisen muistin muistiin. Kun olemme poistuneet if -lauseen laajuudesta, palautamme sen, mihin ptrInstance osoittaa, jota ilmaisee syntaksi "*ptrInstance". Käytämme tätä toimintoa voimakkaasti, kun teemme staattisia julkisia toimintojamme, joten voimme tarkistaa, onko singleton luotu ja varattu muistille. Pohjimmiltaan tämä toiminto tekee siitä niin, että sinulla voi olla vain yksi luokan varaus eikä enempää.

Tältä luokkamme pitäisi näyttää nyt Instance () -funktion luomisen jälkeen. Kuten näette, kaikki tekemämme on pysynyt luokan yksityisessä osassa, tämä muuttuu hieman seuraavien vaiheiden aikana.

Vaihe 6: Staattisten julkisten toimintojen luominen

Staattisten julkisten toimintojen luominen
Staattisten julkisten toimintojen luominen
Staattisten julkisten toimintojen luominen
Staattisten julkisten toimintojen luominen
Staattisten julkisten toimintojen luominen
Staattisten julkisten toimintojen luominen

Kun olet tehnyt toiminnon kohteesta

Vaihe 5, voit aloittaa staattisten julkisten toimintojen tekemisen. Jokaisella julkisella toiminnolla tulee olla yksityinen toiminto sen mukana, sen nimi ei voi olla sama. Miksi tehdä toiminnosta staattinen? Teemme julkisista toiminnoista staattisia, jotta niihin pääsee ilman todellista kohdetta. Joten sen sijaan, että tekisimme jotain "EngineDebugSingleObj-> SomeFunction ()", teemme "EngineDebugSingleton:: Some Function ()". Tämä mahdollistaa yksittäisen pääsyn periaatteessa mihin tahansa koodiin, jos olet #sisällyttänyt otsikkotiedoston tiettyyn projektitiedostoon, jonka kanssa työskentelet. Tämän avulla voit myös luoda singletin sen julkisten toimintojen kautta.

Tässä vaiheessa olemme luoneet kaksi julkista staattista tyhjiöfunktiota, "add ()" ja "vähennä ()". Yksityisessä osiossa on kaksi muuta toimintoa, “PrivAdd ()” ja “PrivSubtract ()”. Lisäsimme myös int -muuttujan nimeltä "NumberOfThings". Näiden toimintojen määritelmä tulee luokkamme CPP -tiedostoon. Jotta toiminto saataisiin helposti CPP -tiedostoon, korosta kohdistimella toiminto, jonka alla pitäisi olla vihreä viiva, ja paina”Vasen ALT + ENTER”, jolloin voit luoda määritelmän luokkien CPP -tiedosto. Katso kuva 6.1, miltä otsikkotiedoston pitäisi näyttää ja kun olet luonut kaikki funktiomääritelmät, CPP: n pitäisi näyttää valokuvalta 6.2 paitsi, että funktiomääritelmissäsi ei ole koodia.

Haluat nyt lisätä toiminnon määritelmiin saman koodin kuin kuvassa 6.2. Kuten aiemmin todettiin, julkiset toiminnot käyttävät Instance () -funktiota, joka palauttaa sen, mitä ptrInstance osoittaa. Näin voimme käyttää luokkamme yksityisiä toimintoja. Minkä tahansa yksittäisen julkisen toiminnon kanssa sinun pitäisi kutsua vain kyseistä instanssitoimintoa. Ainoa poikkeus tähän on Lopeta -toiminto.

Huomautus: Tässä vaiheessa esitetyt tarkat julkiset ja yksityiset toiminnot eivät ole välttämättömiä, yksityisellä toiminnolla voi olla erilaisia toimintojen nimiä ja toimintoja, mutta kaikentyyppisille julkisille toiminnoille sinulla on oltava yksityinen toiminto sen mukana ja julkisen toiminnon tulisi aina käyttää meidän tapauksessamme Instance () -funktiota.

Vaihe 7: Lopetustoiminnon luominen

Lopetustoiminnon luominen
Lopetustoiminnon luominen
Lopetustoiminnon luominen
Lopetustoiminnon luominen

Koska voimme luokitella vain yksittäisen yksikkömme muistista, meidän on luotava staattinen julkinen toiminto. Tämä toiminto kutsuu poistoa ptrInstance -ohjelmassa, joka kutsuu luokan tuhoajan, ja sitten haluamme asettaa ptrInstance -asetukseksi nullptr, jotta se voidaan jakaa uudelleen, jos ohjelmasi ei pääty. Haluat myös lopettaa Singletonit siivotaksesi minkä tahansa varatun muistin, jonka olet varannut Singletonin yksityisissä muuttujissa.

Vaihe 8: PtrInstance -asetukseksi Nullptr

PtrInstance -asetukseksi Nullptr
PtrInstance -asetukseksi Nullptr

Viimeistelläksesi singletonin haluat siirtyä EngineDebugSingleton. CPP -tiedostoon ja kirjoittaa CPP -tiedoston yläreunaan meidän tapauksessamme”EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr”.

Tämän tekeminen asettaa aluksi ptrInstance -arvoksi nullptr, joten kun käyt läpi ilmentymäfunktion ensimmäistä kertaa, luokkamme saa varata muistiin. Ilman sitä saat todennäköisesti virheen, koska yrität käyttää muistia, jolle ei ole varattu mitään.

Vaihe 9: Testi ja johtopäätös

Testi ja johtopäätös
Testi ja johtopäätös

Haluamme nyt testata, että yksittäinen yksikkömme toimii sen varmistamiseksi, että se toimii. Tämä edellyttää, että kutsumme julkisia toimintoja, kuten vaiheessa 6 on kuvattu, ja suosittelemme, että määrität keskeytyskohdat koodisi läpi ja näet, että yksittäinen toimii sen pitäisi olla. Lähtökohtamme on projektimme main.cpp ja main.cpp näyttää nyt alla olevasta kuvasta.

Onnittelut! Olet juuri suorittanut ensimmäisen Singleton -suunnittelumallin käyttöönoton. Tämän suunnittelumallin avulla voit virtaviivaistaa koodiasi monin eri tavoin. Nyt voit esimerkiksi tehdä esimiesjärjestelmiä, jotka toimivat koko ohjelman käyttöajan, ja joihin pääsee käsiksi staattisten toimintojen kautta missä tahansa, johon olet sisällyttänyt luokan.

Lopullisen otsikkotiedoston pitäisi näyttää valokuvalta 7.1. Singletoniin liittyvän CPP -tiedoston pitäisi näyttää valokuvalta 6.2, ja tiedoston yläreunaan on lisätty vaiheessa 8 näytetty koodi. Tämä ohje tarjosi sinulle yksinkertaisen rakenteen Singleton Design Patternista.

Vianetsintäohjeet:

Haetaanko muistiin liittyviä virheitä?

Muista katsoa vaiheita 7 ja 8 varmistaaksesi, että asetat ptrInstance -asetukseksi nullptr.

Loputon silmukka esiintyy?

Varmista, että julkisten toimintojen määritelmissä kutsut yksityistä toimintoa, ei samaa julkista toimintoa.

Yksikköön kohdistetut objektit aiheuttavat muistivuotoja?

Muista soittaa singletonin lopetustoimintoon, kun se on sopivaa ohjelmakoodin puitteissa, ja varmista, että singletonin tuhoajalla on poistettu kaikki muistille varatut objektit kohdasta yksittäisen koodin puitteissa.