Turinys:

Kaip atlikti „Singleton“dizaino modelį C ++: 9 žingsniai
Kaip atlikti „Singleton“dizaino modelį C ++: 9 žingsniai

Video: Kaip atlikti „Singleton“dizaino modelį C ++: 9 žingsniai

Video: Kaip atlikti „Singleton“dizaino modelį C ++: 9 žingsniai
Video: Pertvarkymas: Singleton [dizaino modeliai] 2024, Birželis
Anonim
Kaip padaryti „Singleton“dizaino modelį C ++
Kaip padaryti „Singleton“dizaino modelį C ++

Įvadas:

Šio instrukcijų vadovo tikslas yra išmokyti vartotoją, kaip įdiegti atskirą dizaino modelį savo C ++ programoje. Tai darydamas, šis instrukcijų rinkinys taip pat paaiškins skaitytojui, kodėl pavieniai elementai yra tokie, kokie yra, ir kaip apdorojamas kodas. Tai žinodami, ateityje padėsite derinti būsimus singlus. Koks yra vieno dizaino modelis? Vienkartinis dizaino modelis yra dizaino šablonas, kai kodavimo priemonė sukuria klasę, kurią galima tik vieną kartą parodyti, o klasių viešąsias funkcijas iš esmės galima pasiekti bet kur, jei #įtraukėte antraštės failą į kitus su projektu susijusius failus.

Vienkartinis dizaino modelis yra privalomas bet kokio į objektą orientuoto programuotojo, programuotojo ir žaidimų programuotojo dizaino modelis. Vienkartinis dizaino modelis taip pat yra vienas iš paprasčiausių kodavimo dizaino modelių. Jį išmokus, ateityje gali padėti išmokti kitų, sunkesnių dizaino modelių. Tai taip pat gali padėti supaprastinti programos kodą taip, kaip manėte, kad tai neįmanoma.

Nors vieno dizaino modelio sudėtingumas yra lengvas, palyginti su kitais dizaino modeliais, šis instrukcijų rinkinys yra vidutinio sunkumo. Tai reiškia, kad norėdami atlikti šias instrukcijas, rekomenduojame žinoti pagrindinius ir išankstinius C ++ sintaksės reikalavimus. Taip pat turėtumėte žinoti tinkamą C ++ kodavimo etiketą (t. Y. Laikyti klasės kintamuosius privačius, vieną klasę antraštės faile ir pan.). Taip pat turėtumėte žinoti, kaip atlaisvinti atminties ir kaip konstruktoriai bei naikintojai dirba „C ++“.

Šis mokymo vadovas užtruks vidutiniškai apie 10-15 minučių.

Medžiagos reikalavimai:

-Kompiuteris (gali būti kompiuteris arba „Mac“), galintis paleisti „Visual Studios“(bet kokia versija)

-Paprasta programa, sukurta „Visual Studios“, su kuria galite išbandyti savo singlą

Pastaba: atskirą dizaino modelį galima atlikti naudojant bet kurią kitą C ++ palaikančią IDE arba kodavimo sąsają, tačiau šiam instrukcijų rinkiniui naudosime „Visual Studios Enterprise Edition“.

1 žingsnis: sukurkite savo klasę naudodami antraštės failą ir CPP failą

Sukurkite savo klasę naudodami antraštės failą ir CPP failą
Sukurkite savo klasę naudodami antraštės failą ir CPP failą
Sukurkite savo klasę naudodami antraštės failą ir CPP failą
Sukurkite savo klasę naudodami antraštės failą ir CPP failą

Norėdami sukurti šiuos du failus ir klasę vienu metu, atidarykite savo projektą / programą „Visual Studios“, eikite į sprendimų naršyklę, dešiniuoju pelės mygtuku spustelėkite ir šalia pelės žymeklio turėtų būti rodomas langelis, suraskite parinktį „Pridėti“, užveskite pelės žymeklį virš jo, o dešinėje turėtų atsirasti kitas langelis. Šiame laukelyje norite rasti parinktį „Naujas elementas..“, spustelėkite jį ir pasirodys langas, panašus į žemiau esantį 1.1 paveikslėlio vaizdą. Šiame lange norite pasirinkti „C ++ klasę“, tada paspauskite „Pridėti“. Bus atidarytas kitas langas, panašus į 1.2 nuotraukos vaizdą. Šiame lange lauke „Klasės pavadinimas“įveskite savo klasės pavadinimą ir „Visual Studios“automatiškai pavadins faktinį failą po klasės pavadinimo. Šios instrukcijos tikslais savo klasę pavadinsime „EngineDebugSingleton“, tačiau tai gali būti bet koks raidžių pavadinimas. Dabar galite paspausti „Gerai“ir pereiti prie 2 veiksmo.

Pastaba: sprendimų naršyklė ir tai, kur failai saugomi jūsų kompiuteryje, yra atskirai. Perkeldami ar kurdami ką nors sprendimų naršyklėje, jūsų OS failų naršyklėje esantys failai nebus perkelti ar tvarkyti. Saugus būdas tvarkyti failus failų naršyklės pusėje būtų pašalinti, bet ne ištrinti konkrečius failus iš sprendimų naršyklės, perkelti tuos pačius failus į failų naršyklę į norimą vietą ir grįžti į sprendimų naršyklę, dešiniuoju pelės mygtuku spustelėkite, suraskite parinktį „Pridėti“, tada suraskite „Esamas elementas“ir suraskite perkeltus failus. Būtinai perkelkite antraštę ir cpp failą.

2 veiksmas: nustatykite konstruktorių į privatų

Nustatykite konstruktorių į privatų
Nustatykite konstruktorių į privatų

Jei naujai sukurtas CPP failas ir antraštės failas neatsidarė automatiškai, kai jį sukūrėte, eikite į sprendimų naršyklę ir spustelėkite ir atidarykite „EngineDebugSingleton.h“. Tada būsite pasveikinti „EngineDebugSingleton ()“, numatytuoju klasės konstruktoriumi ir „~ EngineDebugSingleton ()“klasės naikintoju. Šiam žingsniui norėsime nustatyti konstruktorių kaip privatų, tai reiškia, kad ši funkcija prieinama tik klasei ir nieko kito. Tokiu būdu negalėsite sukurti kintamojo ar priskirti klasės atminties už klasės ribų, tik klasių antraščių faile ir kitose klasių funkcijose. Konstruktoriaus privatumas yra raktas į dizaino modelį ir tai, kaip veikia pavieniai asmenys. Tolesniais žingsniais atrasime, kaip pavienis elementas yra parodomas ir pasiekiamas.

Dabar klasė turėtų atrodyti taip, perkėlus konstruktorių į privatų (žiūrėkite susijusią nuotrauką)

3 veiksmas: nustatykite naikintoją kaip privatų

Nustatykite naikintoją į Privatus
Nustatykite naikintoją į Privatus

Kaip mes padarėme su konstruktoriumi

2 veiksmas, šiam žingsniui dabar nustatysime naikintoją į privatų. Kaip ir konstruktorius, niekas, išskyrus pačią klasę, negalės iš atminties ištrinti jokių klasės kintamųjų.

Baigę šį veiksmą klasė dabar turėtų atrodyti taip. (Žr. Susijusią nuotrauką)

4 veiksmas: statinio rodyklės kintamojo sukūrimas „Singleton“

Statinio rodyklės kintamojo sukūrimas „Singleton“
Statinio rodyklės kintamojo sukūrimas „Singleton“

Šiame žingsnyje mes sukursime a

„EngineDebugSingleton*“tipo statinis rodyklės kintamasis. Tai bus kintamasis, kuris bus naudojamas priskirti mūsų singlą atminčiai ir parodys į jį visą laiką, kai mūsų singlas yra priskirtas atminčiai.

Taip turėtų atrodyti mūsų antraštės failas sukūrus šį kintamąjį

5 veiksmas: egzemplioriaus funkcijos sukūrimas

Egzamino funkcijos kūrimas
Egzamino funkcijos kūrimas

Dabar norime padaryti pavyzdį

funkcija. Funkcija turi būti statinė funkcija ir norės grąžinti nuorodą į mūsų klasę („EngineDebugSingleton &“). Mes savo funkciją pavadinome egzemplioriumi (). Pačioje funkcijoje pirmiausia norėsime išbandyti, ar ptrInstance == nullptr (galima sutrumpinti iki! PtrInstance), jei jis yra nullptr, tai reiškia, kad pavienis elementas nebuvo priskirtas, o jei sakysime apimtį, norite paskirstyti atlikdami ptrInstance = new EngineDebugSingleton (). Čia jūs iš tikrųjų priskiriate singlą atminčiai. Išėję iš teiginio if apimties, grąžinsime tai, į ką nurodo „ptrInstance“, kuris žymimas sintaksė „*ptrInstance“. Šią funkciją intensyviai naudosime atlikdami statines viešąsias funkcijas, kad galėtume patikrinti, ar singlas buvo sukurtas ir priskirtas atminčiai. Iš esmės ši funkcija leidžia jums turėti tik vieną klasės paskirstymą ir ne daugiau.

Štai kaip mūsų klasė turėtų atrodyti dabar sukūrus funkciją „Instance ()“. Kaip matote, visa tai, ką padarėme, liko privačioje klasės skiltyje, tai šiek tiek pasikeis artimiausiais žingsniais.

6 žingsnis: statinių viešųjų funkcijų kūrimas

Statinių viešųjų funkcijų kūrimas
Statinių viešųjų funkcijų kūrimas
Statinių viešųjų funkcijų kūrimas
Statinių viešųjų funkcijų kūrimas
Statinių viešųjų funkcijų kūrimas
Statinių viešųjų funkcijų kūrimas

Kai atliksite funkciją iš

5 veiksmą, galite pradėti statines viešąsias funkcijas. Kiekviena viešoji funkcija turi turėti privačią funkciją, jos pavadinimas negali būti tas pats. Kodėl funkcija turi būti statiška? Mes padarome viešąsias funkcijas statiškas, kad jas būtų galima pasiekti be tikro objekto. Taigi, užuot darę kažką panašaus į „EngineDebugSingleObj-> SomeFunction ()“, mes darome „EngineDebugSingleton:: Some Function ()“. Dėl to pavieniui galima pasiekti iš esmės bet kurioje kodo vietoje, jei #įtraukėte antraštės failą į konkretų projekto failą, su kuriuo dirbate. Taip pat galite sukurti singlą naudodamiesi bet kuriomis jo viešosiomis funkcijomis.

Šiuo tikslu mes sukūrėme dvi viešąsias statinio tuštumo funkcijas: „pridėti ()“ir „atimti ()“. Privačiame skyriuje mes dar dvi funkcijas, „PrivAdd ()“ir „PrivSubtract ()“. Taip pat pridėjome int kintamąjį „NumberOfThings“. Šių funkcijų apibrėžimas bus įtrauktas į mūsų klasių CPP failą. Kad funkcija lengvai patektų į CPP failą, žymekliu pažymėkite funkciją, po kuria turi būti žalia eilutė, ir paspauskite „Kairė ALT + ENTER“, tai suteiks jums galimybę sukurti apibrėžimą klasių susietą CPP failą. Žiūrėkite 6.1 nuotrauką, kad pamatytumėte, kaip turėtų atrodyti antraštės failas, o sukūrę visas funkcijų apibrėžtis, jūsų CPP turėtų atrodyti kaip 6.2 nuotrauka, išskyrus tai, kad jūsų funkcijų apibrėžimuose nebus kodo.

Dabar į savo funkcijų apibrėžimus norėsite pridėti tą patį kodą, kaip parodyta 6.2 nuotraukoje. Kaip minėta anksčiau, mūsų viešosios funkcijos naudos funkciją „Instance“(), kuri grąžins tai, ką nurodo „ptrInstance“. Tai leidžia mums pasiekti privačias mūsų klasės funkcijas. Atlikdami bet kokią viešą pavienio asmens funkciją, turėtumėte skambinti tik ta egzemplioriaus funkcija. Vienintelė išimtis yra mūsų funkcija „Nutraukti“.

Pastaba: tikslios viešosios ir privačios funkcijos, parodytos šiame veiksme, nebūtinos, privačioje funkcijoje galite turėti skirtingus funkcijų pavadinimus ir operacijas, tačiau bet kokio tipo viešoms funkcijoms turėtumėte turėti privačią funkciją ir viešoji funkcija visada turėtų naudoti, mūsų atveju, funkciją Instance ().

7 veiksmas: nutraukimo funkcijos kūrimas

Funkcijos nutraukimas kūrimas
Funkcijos nutraukimas kūrimas
Funkcijos nutraukimas kūrimas
Funkcijos nutraukimas kūrimas

Kadangi savo klasę galime išskirti tik iš atminties savo klasėje, turime sukurti statišką viešąją funkciją. Ši funkcija iškvies ištrynimą „ptrInstance“, kuri iškviečia klasės naikintoją, o tada norėsime nustatyti „ptrInstance“atgal į nullptr, kad ją būtų galima vėl priskirti, jei jūsų programa nesibaigs. Taip pat norėsite nutraukti „Singletons“, kad išvalytumėte visą priskirtą atmintį, kurią skyrėte bet kokiuose „Singleton“kintamuosiuose.

8 veiksmas: nustatykite „PtrInstance“į „Nullptr“

PtrInstance nustatymas į Nullptr
PtrInstance nustatymas į Nullptr

Norėdami užbaigti savo singletoną, norite pereiti prie failo „EngineDebugSingleton. CPP“ir CPP failo viršuje, mūsų atveju, įvesti „EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr“.

Jei tai padarysite, iš pradžių „ptrInstance“bus nustatyta kaip „nullptr“, todėl pirmą kartą pirmą kartą peržiūrėjus egzemplioriaus funkciją, mūsų klasė bus leidžiama priskirti atminčiai. Be jo greičiausiai gausite klaidą, nes bandysite pasiekti atmintį, kuriai nieko nėra skirta.

9 žingsnis: bandymas ir išvados

Testas ir išvados
Testas ir išvados

Dabar norėsime patikrinti, ar mūsų singlas veikia, kad būtume tikri, jog jis veikia. Tai reiškia, kad mes iškviesime viešąsias funkcijas, kaip aprašyta 6 veiksme, ir rekomenduojame nustatyti pertraukas, kad pereitumėte prie savo kodo ir pamatytumėte, ar singlas veikia kaip turėtų būti. Mūsų pradinis taškas bus mūsų projekto main.cpp, o mūsų main.cpp dabar atrodo kaip paveikslėlis žemiau.

Sveikinu! Jūs ką tik baigėte įgyvendinti „Singleton“dizaino modelį. Naudodami šį dizaino modelį, galite supaprastinti savo kodą įvairiais būdais. Pavyzdžiui, dabar galite sukurti valdytojo sistemas, veikiančias per jūsų programos vykdymo laiką, kurias galima pasiekti naudojant statines funkcijas bet kur, kur įtraukėte klasę.

Galutinis antraštės failas turėtų atrodyti kaip 7.1 nuotrauka. Susijęs su jūsų singleton CPP failas turėtų atrodyti kaip 6.2 nuotrauka, failo viršuje pridėjus kodą, parodytą 8 veiksme. Ši instrukcija suteikė jums paprastą „Singleton Design Pattern“struktūrą.

Patarimai dėl trikčių šalinimo:

Gaunate su atmintimi susijusių klaidų?

Būtinai atlikite 7 ir 8 veiksmus, kad įsitikintumėte, jog nustatote „ptrInstance“į „nullptr“.

Ar atsiranda begalinė kilpa?

Įsitikinkite, kad viešųjų funkcijų apibrėžimuose vadinate privačią funkciją, o ne tą pačią viešąją funkciją.

Viename objekte priskirti objektai sukelia atminties nutekėjimą?

Įsitikinkite, kad paskambinote savo vienintelio nutraukimo funkcijai, kai tai atitinka jūsų programos kodą, ir savo singlo destruktoriuje būtinai pašalinkite visus objektus, kurie buvo priskirti atminčiai vienkartinio kodo ribose.