Sadržaj:

Kako napraviti singleton dizajn uzorak u C ++: 9 koraka
Kako napraviti singleton dizajn uzorak u C ++: 9 koraka

Video: Kako napraviti singleton dizajn uzorak u C ++: 9 koraka

Video: Kako napraviti singleton dizajn uzorak u C ++: 9 koraka
Video: C#. Паттерн Singleton. Урок 40 2024, Lipanj
Anonim
Kako napraviti Singleton dizajn uzorak u C ++
Kako napraviti Singleton dizajn uzorak u C ++

Uvod:

Svrha ovog vodiča s uputama je naučiti korisnika kako implementirati singleton dizajn uzorak u svoj C ++ program. Pritom će ovaj skup uputa čitatelju također objasniti zašto su elementi singletona takvi kakvi jesu i kako se kôd obrađuje. Znajući to, u budućnosti će vam pomoći u otklanjanju pogrešaka u vašim budućim samcima. Što je obrazac singleton dizajna? Jednostruki uzorak dizajna uzorak je dizajna u kojem koder stvara klasu koja se može pokrenuti samo jednom, javnim funkcijama klasa se u osnovi može pristupiti bilo gdje, pod uvjetom da ste #included datoteku zaglavlja u drugim datotekama vezanim uz projekt.

Uzorak pojedinačnog dizajna mora biti poznat uzorak dizajna za svakog objektno orijentiranog programera, programera i programera. Uzorak singleton dizajna također je jedan od najjednostavnijih uzoraka dizajna kodiranja. Njegovo učenje može vam pomoći da naučite druge, teže dizajnerske obrasce u budućnosti. Također vam može pomoći da pojednostavite kôd svog programa na načine za koje niste mislili da su mogući.

Iako je poteškoća singleton dizajna jednostavna u usporedbi s drugim dizajnerskim uzorcima, ovaj skup uputa ima srednju poteškoću. To znači da za izvršavanje ovih uputa preporučujemo da poznajete osnovne i napredne zahtjeve sintakse za C ++. Također biste trebali znati pravilnu etiketu kodiranja C ++ (tj. Neka varijable klase budu privatne, jedna klasa po datoteci zaglavlja itd.). Također biste trebali znati osloboditi memoriju i kako konstruktori i destruktori rade u C ++.

Ovaj vodič će trajati u prosjeku oko 10-15 minuta.

Materijalni zahtjevi:

-Računalo (može biti PC ili Mac) koje može pokrenuti Visual Studios (bilo koja verzija)

-Jednostavan program, kreiran u Visual Studiosu, s kojim možete testirati svoj singleton

Napomena: Jednostruki uzorak dizajna može se izvesti na bilo kojem drugom C ++ podržanom IDE -u ili sučelju za kodiranje, ali za ovaj skup uputa koristit ćemo Visual Studios Enterprise Edition.

Korak 1: Kreirajte svoj razred s datotekom zaglavlja i CPP datotekom

Napravite svoj razred s datotekom zaglavlja i CPP datotekom
Napravite svoj razred s datotekom zaglavlja i CPP datotekom
Napravite svoj razred s datotekom zaglavlja i CPP datotekom
Napravite svoj razred s datotekom zaglavlja i CPP datotekom

Da biste stvorili ove dvije datoteke i klasu odjednom, otvorite svoj projekt / program u Visual Studiosu, prijeđite na istraživač rješenja, kliknite desnom tipkom miša i okvir bi se trebao pojaviti u blizini pokazivača miša, pronađite opciju "Dodaj", zadržite pokazivač iznad njega, a drugi okvir trebao bi se pojaviti s desne strane. U ovom okviru želite pronaći opciju "Nova stavka..", kliknite na nju i trebao bi se pojaviti prozor sličan donjoj slici 1.1. U ovom prozoru želite odabrati “C ++ Class”, a zatim pritisnuti “Add”. Ovo će otvoriti još jedan prozor koji nalikuje slici 1.2. U ovom prozoru upisujete naziv svoje klase u polje "Naziv klase" i Visual Studios će automatski imenovati stvarnu datoteku nakon imena klase. U svrhu ove upute nazvat ćemo našu klasu “EngineDebugSingleton”, ali to može biti bilo koji naziv baziran na slovima. Sada možete pritisnuti “OK” i prijeći na korak 2.

Napomena: Istraživač rješenja i mjesta gdje se datoteke drže na vašem računalu su zasebne. Premještanjem ili stvaranjem bilo čega u istraživaču rješenja nećete premjestiti niti organizirati datoteke unutar vašeg istraživača datoteka OS -a. Siguran način organiziranja datoteka na strani istraživača datoteka bio bi uklanjanje, ali ne i brisanje određenih datoteka iz istraživača rješenja, premještanje istih datoteka u istraživaču datoteka na željeno mjesto, a zatim povratak na istraživač rješenja, desni klik, pronađite opciju "Dodaj", zatim pronađite "Postojeću stavku" i pronađite datoteke koje ste premjestili. Premjestite i zaglavlje i cpp datoteku.

Korak 2: Postavite Konstruktor na Privatno

Konstruktor postavite na Privatno
Konstruktor postavite na Privatno

S novostvorenom CPP datotekom i datotekom zaglavlja, ako se nisu automatski otvorile kada ste je stvorili, idite na istraživač rješenja i kliknite i otvorite “EngineDebugSingleton.h”. Tada će vas dočekati “EngineDebugSingleton ()”, zadani konstruktor klase i “~ EngineDebugSingleton ()” destruktor klase. Za ovaj korak htjet ćemo postaviti konstruktor na privatno, što znači da je ova funkcija dostupna samo klasi i ništa drugo. Time nećete moći napraviti varijablu ili dodijeliti klasu u memoriju izvan klase, samo u datoteci zaglavlja klase i ostalim funkcijama klasa. Privatnost konstruktora ključna je za uzorak projektiranja i način rada singletona. U budućim koracima otkrit ćemo kako se pojedinačni instancira i pristupa.

Klasa bi sada trebala izgledati ovako nakon premještanja konstruktora u privatnu (pogledajte povezanu fotografiju)

Korak 3: Postavite Destructor na Privatno

Destructor postavite na Private
Destructor postavite na Private

Kao što smo učinili s konstruktorom u

korak 2, za ovaj korak, sada ćemo destruktor postaviti na privatno. Kao i kod konstruktora, ništa osim same klase neće moći izbrisati sve varijable klase iz memorije.

Nakon završetka ovog koraka razred bi trebao izgledati ovako. (Pogledajte povezanu fotografiju)

Korak 4: Stvaranje varijable statičkog pokazivača u Singletonu

Stvaranje varijable statičkog pokazivača u Singletonu
Stvaranje varijable statičkog pokazivača u Singletonu

U ovom koraku stvorit ćemo

varijabla statičkog pokazivača tipa “EngineDebugSingleton*”. To će biti varijabla koja će se koristiti za dodjeljivanje našeg singletona memoriji i pokazivat će na nju cijelo vrijeme dok je naš singleton dodijeljen memoriji.

Ovako bi naša zaglavna datoteka trebala izgledati nakon stvaranja ove varijable

Korak 5: Stvaranje funkcije instance

Stvaranje Instance funkcije
Stvaranje Instance funkcije

Sada želimo napraviti instancu

funkcija. Funkcija će morati biti statička funkcija i htjet će vratiti referencu u našu klasu (“EngineDebugSingleton &”). Našu smo funkciju nazvali Instance (). U samoj funkciji htjet ćemo prvo testirati je li ptrInstance == nullptr (može se skratiti na! PtrInstance), ako je nullptr, to znači da singleton nije dodijeljen i u opsegu if naredbe, mi ćemo želite dodijeliti radeći ptrInstance = new EngineDebugSingleton (). Ovdje zapravo dodjeljujete singleton memoriji. Nakon izlaska iz opsega if naredbe, vratit ćemo ono na što pokazuje ptrInstance, što je označeno sintaksom “*ptrInstance”. Ovu ćemo funkciju jako koristiti pri izradi statičkih javnih funkcija, pa možemo provjeriti je li singleton kreiran i dodijeljen memoriji. U biti, ova funkcija čini tako da možete imati samo jednu dodjelu klase i ne više.

Ovako bi naša klasa trebala izgledati sada nakon stvaranja funkcije Instance (). Kao što vidite, sve što smo učinili ostalo je u privatnom odjeljenju razreda, to će se malo promijeniti u sljedećih nekoliko koraka.

Korak 6: Stvaranje statičkih javnih funkcija

Stvaranje statičkih javnih funkcija
Stvaranje statičkih javnih funkcija
Stvaranje statičkih javnih funkcija
Stvaranje statičkih javnih funkcija
Stvaranje statičkih javnih funkcija
Stvaranje statičkih javnih funkcija

Nakon što ste napravili funkciju iz

korak 5, možete početi stvarati statičke javne funkcije. Svaka javna funkcija trebala bi imati privatnu funkciju koja ide uz nju, naziv ove funkcije ne može biti isti. Zašto funkciju učiniti statičnom? Javne funkcije činimo statičkim kako bi im se moglo pristupiti bez stvarnog objekta. Stoga umjesto da radimo nešto poput “EngineDebugSingleObj-> SomeFunction ()”, radimo “EngineDebugSingleton:: Some Function ()”. To omogućuje pristup singletonu u osnovi bilo gdje u kodu, pod uvjetom da ste #uključili datoteku zaglavlja u određenu datoteku projekta s kojom radite. Na ovaj način možete stvoriti singleton kroz bilo koju od njegovih javnih funkcija.

Za naše potrebe u ovom koraku stvorili smo dvije javne statičke funkcije void, “add ()” i “subtract ()”. U privatnom odjeljku imamo još dvije funkcije, “PrivAdd ()” i “PrivSubtract ()”. Dodali smo i int varijablu pod nazivom "NumberOfThings". Definicija ovih funkcija ući će u CPP datoteku naših klasa. Da biste jednostavno unijeli funkciju u CPP datoteku, pokazivačem označite funkciju koja bi trebala imati zelenu liniju ispod te pritisnite "Lijevo ALT + ENTER", to će vam dati mogućnost stvaranja definicije u klase povezane CPP datoteke. Pogledajte Fotografiju 6.1 da biste vidjeli kako bi zaglavna datoteka trebala izgledati, a nakon što ste stvorili sve definicije funkcija, CPP bi trebao izgledati kao Fotografija 6.2, osim što definicije funkcija neće imati kôd.

Sada ćete u definicije funkcija dodati isti kôd kao na fotografiji 6.2. Kao što je ranije rečeno, naše javne funkcije koristit će funkciju Instance (), koja će vratiti ono na što ptrInstance pokazuje. To nam omogućuje pristup privatnim funkcijama naše klase. Uz bilo koju singleton javnu funkciju, trebali biste pozivati samo tu Instance funkciju. Jedina iznimka od ovoga je naša funkcija Prekini.

Napomena: Točne javne i privatne funkcije prikazane u ovom koraku nisu potrebne, u privatnoj funkciji možete imati različite nazive funkcija i operacije, ali za bilo koju vrstu javne funkcije trebate imati privatnu funkciju koja ide uz nju i javna funkcija uvijek bi trebala koristiti, u našem slučaju, funkciju Instance ().

Korak 7: Stvaranje funkcije prekidanja

Stvaranje funkcije prekidanja
Stvaranje funkcije prekidanja
Stvaranje funkcije prekidanja
Stvaranje funkcije prekidanja

Budući da u studiju možemo samo osloboditi naš singleton iz memorije, moramo stvoriti statičku javnu funkciju. Ova funkcija će pozvati delete na ptrInstance, koji poziva destruktor klase, a zatim ćemo htjeti vratiti ptrInstance na nullptr tako da se može ponovno dodijeliti ako vaš program ne završi. Također ćete htjeti prekinuti svoje Singletone da biste očistili dodijeljenu memoriju koju ste dodijelili bilo kojoj Singletonovoj privatnoj varijabli.

Korak 8: Postavljanje PtrInstance na Nullptr

Postavljanje PtrInstance na Nullptr
Postavljanje PtrInstance na Nullptr

Da biste dovršili svoj singleton, želite prijeći na datoteku EngineDebugSingleton. CPP, a na vrhu CPP datoteke, u našem slučaju, upišite “EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr.”

Time ćete u početku postaviti ptrInstance na nullptr, pa kad prvi put prođete kroz funkciju instance, našoj klasi će biti dopušteno dodijeliti memoriji. Bez toga ćete najvjerojatnije dobiti pogrešku jer ćete pokušati pristupiti memoriji koja joj nema ništa dodijeljeno.

Korak 9: Test i zaključak

Test i zaključak
Test i zaključak

Sada ćemo htjeti testirati naš singleton kako bismo bili sigurni da radi, to će uključivati pozivanje javnih funkcija kao što je opisano u koraku 6 i preporučujemo vam da postavite prekidne točke za prolazak kroz vaš kôd i provjerite radi li singleton kao trebalo bi biti. Naše polazište bit će u main.cpp našeg projekta, a main.cpp sada izgleda kao na slici ispod.

Čestitamo! Upravo ste dovršili svoju prvu implementaciju Singleton Design Pattern -a. S ovim dizajnerskim uzorkom sada možete pojednostaviti svoj kôd na različite načine. Na primjer, sada možete napraviti sustave upravitelja koji rade tijekom vremena izvođenja vašeg programa, a kojima se može pristupiti putem statičkih funkcija bilo gdje gdje ste uključili klasu.

Vaša zadnja datoteka zaglavlja trebala bi izgledati poput fotografije 7.1. Povezana CPT datoteka vašeg singletona trebala bi izgledati kao fotografija 6.2 s dodatkom, na vrhu datoteke, koda prikazanog u koraku 8. Ova vam je uputa pružila jednostavnu strukturu uzorka dizajna Singleton.

Savjeti za rješavanje problema:

Dobivanje grešaka povezanih s memorijom?

Pobrinite se da pogledate korake 7 i 8 kako biste bili sigurni da ptrInstance postavljate na nullptr.

Dolazi do beskonačne petlje?

Uvjerite se da javne funkcije u njihovim definicijama pozivate privatnu, a ne istu javnu funkciju.

Objekti dodijeljeni unutar singletona uzrokuju curenje memorije?

Pobrinite se da pozovete završnu funkciju vašeg singletona kada je to prikladno u vašem programskom kodu, a u destruktoru vašeg singletona, poništite dodjelu svih objekata koji su dodijeljeni memoriji unutar opsega singleton koda.