Tartalomjegyzék:

A Singleton tervezési minta végrehajtása C ++ nyelven: 9 lépés
A Singleton tervezési minta végrehajtása C ++ nyelven: 9 lépés

Videó: A Singleton tervezési minta végrehajtása C ++ nyelven: 9 lépés

Videó: A Singleton tervezési minta végrehajtása C ++ nyelven: 9 lépés
Videó: Czym są wzorce projektowe? 2024, November
Anonim
Hogyan készítsük el a Singleton tervezési mintát C ++ nyelven
Hogyan készítsük el a Singleton tervezési mintát C ++ nyelven

Bevezetés:

Ennek az útmutatónak az a célja, hogy megtanítsa a felhasználót arra, hogyan kell megvalósítani az egyedi tervezési mintát a C ++ programjában. Ennek során ez az utasításkészlet azt is elmagyarázza az olvasónak, hogy az egyes elemek miért olyanok, amilyenek, és hogyan dolgozzák fel a kódot. Ennek ismerete a jövőben segíteni fog a jövőbeli kislemezek hibakeresésében. Mi az egyedi tervezési minta? Az egyedi tervezési minta olyan tervezési minta, ahol a kódoló létrehoz egy olyan osztályt, amely csak egyszer példányosítható, az osztályok nyilvános funkciói alapvetően bárhol elérhetők, feltéve, hogy #tartalmazza a fejlécfájlt más projekttel kapcsolatos fájlokban.

Az egyedi tervezési minta minden objektumorientált programozó, szoftverprogramozó és játékprogramozó számára kötelező tervezési minta. Az egyedi tervezési minta az egyik legegyszerűbb kódolási tervezési minta. Ennek megtanulása segíthet a jövőben más, nehezebb tervezési minták elsajátításában. Segíthet abban is, hogy egyszerűsítse a program kódját olyan módon, amelyet nem tartott lehetségesnek.

Bár az egyedi tervezési minta nehézsége más konstrukciós mintákhoz képest könnyű, ennek az utasításkészletnek közepes nehézségei vannak. Ez azt jelenti, hogy ezen utasítások végrehajtásához javasoljuk, hogy ismerje a C ++ alapvető és előzetes szintaktikai követelményeit. Ismernie kell a megfelelő C ++ kódolási etikettet is (azaz az osztályváltozókat titokban kell tartani, fejlécfájlonként egy osztályt stb.). Azt is tudnia kell, hogyan szabadítson fel memóriát, és hogyan működnek a konstruktorok és destruktorok a C ++ nyelven.

Ez az útmutató átlagosan körülbelül 10-15 percet vesz igénybe.

Anyagkövetelmények:

-Visual Studios (bármilyen verzió) futtatására alkalmas számítógép (lehet PC vagy Mac)

-Egy egyszerű program, amelyet a Visual Studios -ban hoztak létre, amellyel kipróbálhatja egyedülállóságát

Megjegyzés: Az egyedi tervezési minta bármilyen más C ++ támogató IDE vagy kódoló felületen elvégezhető, de ehhez az utasításkészlethez a Visual Studios Enterprise Edition -t fogjuk használni.

1. lépés: Hozzon létre osztályt fejlécfájllal és CPP -fájllal

Hozzon létre osztályt fejlécfájllal és CPP -fájllal
Hozzon létre osztályt fejlécfájllal és CPP -fájllal
Hozzon létre osztályt fejlécfájllal és CPP -fájllal
Hozzon létre osztályt fejlécfájllal és CPP -fájllal

Ha egyszerre szeretné létrehozni ezt a két fájlt és az osztályt, nyissa meg a projektet / programot a Visual Studios -ban, menjen a megoldás -felfedezőre, kattintson a jobb egérgombbal, és megjelenik egy doboz az egérmutató közelében, keresse meg a „Hozzáadás” lehetőséget, felette, és egy másik doboznak kell megjelennie a jobb oldalon. Ebben a mezőben szeretné megtalálni az „Új elem..” opciót, kattintson rá, és megjelenik egy ablak, amely hasonlít az alábbi 1.1 fényképes képre. Ebben az ablakban válassza ki a „C ++ osztály” lehetőséget, majd nyomja meg a „Hozzáadás” gombot. Ezzel megnyílik egy másik ablak, amely hasonlít a fénykép 1.2 képére. Ebben az ablakban írja be az osztály nevét az „Osztály neve” mezőbe, és a Visual Studios automatikusan elnevezi az aktuális fájlt az osztály neve után. Ebből a célból osztályunkat „EngineDebugSingleton” -nak fogjuk nevezni, de ez lehet bármilyen betűalapú név. Most megnyomhatja az „OK” gombot, és folytathatja a 2.

Megjegyzés: A megoldásböngésző és a fájlok tárolási helye a számítógépen külön vannak. Ha bármit áthelyez vagy létrehoz a megoldásfelfedezőben, akkor nem fogja áthelyezni vagy rendszerezni a fájlokat az operációs rendszer fájlkezelőjében. A fájlok biztonságos tárolásának módja a fájlkezelő oldalon az lenne, ha eltávolítaná, de ne törölje a konkrét fájlokat a megoldáskezelőből, helyezze át ugyanazokat a fájlokat a fájlkezelőben a kívánt helyre, majd térjen vissza a megoldáskezelőhöz, kattintson a jobb gombbal, keresse meg a „Hozzáadás” lehetőséget, majd a „Létező elem” lehetőséget, és keresse meg az áthelyezett fájlokat. Ügyeljen arra, hogy mind a fejlécet, mind a cpp fájlt áthelyezze.

2. lépés: Állítsa a konstruktőrt privátra

Állítsa a konstruktőrt privátra
Állítsa a konstruktőrt privátra

Ha az újonnan létrehozott CPP -fájl és fejlécfájl esetében nem nyílt meg automatikusan, amikor létrehozta, lépjen a megoldáskezelőbe, és kattintson, és nyissa meg a „EngineDebugSingleton.h” fájlt. Ekkor egy „EngineDebugSingleton ()”, az osztály alapértelmezett konstruktorával és „~ EngineDebugSingleton ()” osztálypusztítóval üdvözöl. Ehhez a lépéshez a konstruktort privátra szeretnénk állítani, ez azt jelenti, hogy ez a funkció csak az osztály számára elérhető, semmi más. Ezzel nem tud változót létrehozni, vagy az osztályt az osztályon kívüli memóriához rendelni, csak az osztály fejlécfájljában és az osztályok egyéb funkcióiban. A konstruktor magántulajdonban tartása kulcsfontosságú a tervezési mintában és az egyes szinkronok működésében. A későbbi lépések során felfedezzük, hogyan jelennek meg és hogyan érhetők el az egyediek.

Az osztálynak így kell kinéznie, miután a konstruktőrt privátra helyezte (nézze meg a kapcsolódó fotót)

3. lépés: Állítsa a rombolót privátra

Állítsa a rombolót privátra
Állítsa a rombolót privátra

Ahogy tettük a kivitelezővel

2. lépés, ehhez a lépéshez most a destruktort privátra állítjuk. A konstruktorhoz hasonlóan maga az osztály kivételével semmi sem tudja törölni az osztály változóit a memóriából.

Az osztálynak így kell kinéznie, miután befejezte ezt a lépést. (Lásd a kapcsolódó fotót)

4. lépés: Statikus mutatóváltozó létrehozása a Singletonban

Statikus mutatóváltozó létrehozása a Singletonban
Statikus mutatóváltozó létrehozása a Singletonban

Ebben a lépésben létrehozunk egy

„EngineDebugSingleton*” típusú statikus mutatóváltozó. Ez lesz az a változó, amelyet használni fogunk, hogy szingulettünket a memóriához rendeljük, és rá fog mutatni arra az időre, amíg az egyesünk a memóriához van rendelve.

A fejlécfájlunknak így kell kinéznie a változó létrehozása után

5. lépés: Példányfüggvény létrehozása

Példányfüggvény létrehozása
Példányfüggvény létrehozása

Most példát akarunk készíteni

funkció. A függvénynek statikus függvénynek kell lennie, és vissza kell adnia egy hivatkozást az osztályunkhoz („EngineDebugSingleton &”). Funkciónkat példánynak () neveztük el. Magában a függvényben először azt szeretnénk kipróbálni, hogy a ptrInstance == nullptr (lerövidíthető -e! PtrInstance -re), ha nullptr, ez azt jelenti, hogy a szingleton nincs kiosztva, és az if utasítás hatókörében szeretné lefoglalni a ptrInstance = new EngineDebugSingleton () paranccsal. Ez az a hely, ahol valójában a memóriához rendelheti a szingliket. Az if utasítás hatóköréből való kilépés után visszatérünk arra, amire a ptrInstance mutat, amelyet a „*ptrInstance” szintaxis jelöl. Ezt a funkciót intenzíven fogjuk használni a statikus nyilvános függvények elkészítésekor, így ellenőrizhetjük, hogy létrehozták -e az egylemezt, és hozzárendelték -e a memóriához. Lényegében ez a funkció lehetővé teszi, hogy csak egy kiosztása legyen az osztályból, és ne több.

Így kell kinéznie osztályunknak az Instance () függvény létrehozása után. Amint láthatja, mindaz, amit tettünk, az osztály privát részében maradt, ez a következő néhány lépésben kissé megváltozik.

6. lépés: Statikus nyilvános függvények létrehozása

Statikus nyilvános függvények létrehozása
Statikus nyilvános függvények létrehozása
Statikus nyilvános függvények létrehozása
Statikus nyilvános függvények létrehozása
Statikus nyilvános függvények létrehozása
Statikus nyilvános függvények létrehozása

Miután elvégezte a funkciót innen:

lépésben elkezdheti statikus nyilvános funkciók létrehozását. Minden nyilvános funkciónak rendelkeznie kell privát funkcióval, amely nem lehet azonos. Miért kell statikussá tenni a függvényt? A nyilvános funkciókat statikussá tesszük, hogy tényleges objektum nélkül is hozzáférhetők legyenek. Tehát a „EngineDebugSingleObj-> SomeFunction ()” helyett a „EngineDebugSingleton:: Some Function ()” parancsot kell végrehajtanunk. Ez lehetővé teszi, hogy a szingliket alapvetően bárhol elérjék a kódban, feltéve, hogy #tartalmazza a fejlécfájlt az adott projektfájlban, amellyel dolgozik. Ezzel létrehozhatja a szingliket is bármely nyilvános funkciója révén.

Ebben a lépésben két nyilvános statikus üres függvényt hoztunk létre, az „add ()” és a „kivonás ()” funkciókat. A privát részben további két funkciót, a „PrivAdd ()” és a „PrivSubtract ()” funkciót látjuk el. Hozzáadtunk egy „NumberOfThings” nevű int változót is. Ezeknek a funkcióknak a meghatározása az osztályaink CPP fájljába kerül. Annak érdekében, hogy a függvény könnyen bejusson a CPP fájlba, a kurzorral jelölje ki azt a függvényt, amelynek zöld vonallal kell aláírnia, majd nyomja meg a „Bal ALT + ENTER” billentyűt, és megadja a lehetőséget a definíció létrehozásához a osztályokhoz tartozó CPP -fájl. Lásd a 6.1. Fényképet, hogy megnézze, hogyan kell kinéznie a fejlécfájlnak, és miután létrehozta az összes függvénydefiníciót, a CPP -nek úgy kell kinéznie, mint a 6.2. Fényképnek, kivéve, hogy a funkciódefiníciók nem tartalmaznak kódot.

Most ugyanazt a kódot szeretné hozzáadni a 6.2 fényképhez, mint a funkciódefiníciók. Amint azt korábban említettük, nyilvános funkcióink az Instance () függvényt fogják használni, amely visszaadja azt, amire a ptrInstance mutat. Ez lehetővé teszi számunkra, hogy hozzáférjünk osztályunk privát funkcióihoz. Bármely szingleton nyilvános funkciója esetén csak ezt a példányfüggvényt kell hívnia. Az egyetlen kivétel ez alól a Terminate funkció.

Megjegyzés: Az ebben a lépésben bemutatott pontos nyilvános és privát funkciók nem szükségesek, a privát funkcióban különböző funkciónevek és műveletek lehetnek, de bármilyen típusú nyilvános funkcióhoz hozzá kell rendelnie egy privát funkciót, és a public függvénynek mindig a példánk () függvényt kell használnia.

7. lépés: A Terminate funkció létrehozása

A Terminate funkció létrehozása
A Terminate funkció létrehozása
A Terminate funkció létrehozása
A Terminate funkció létrehozása

Mivel egyedülállónkat csak a memóriából tudjuk osztályozni osztályunkban, statikus nyilvános funkciót kell létrehoznunk. Ez a függvény a delete -t hívja a ptrInstance -en, amely meghívja az osztályrombolót, majd vissza akarjuk állítani a ptrInstance -t nullptr -re, hogy újra le lehessen osztani, ha a program nem ér véget. A Singletonokat is le kell állítania, hogy megtisztítsa a Singleton privát változóiban kiosztott memóriáját.

8. lépés: A PtrInstance beállítása Nullptr -re

A PtrInstance beállítása Nullptr értékre
A PtrInstance beállítása Nullptr értékre

A szingulett befejezéséhez át kell mennie a EngineDebugSingleton. CPP fájlba, és a CPP fájl tetején, példánkban, írja be: „EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr”.

Ezzel kezdetben a ptrInstance értékét nullptr -re állítja, így amikor először megy át a példányfüggvényen, az osztályunk a memóriához rendelhető. Enélkül valószínűleg hibát fog kapni, mert megpróbál hozzáférni a memóriához, amelyhez nincs hozzárendelve semmi.

9. lépés: Teszt és következtetés

Teszt és következtetés
Teszt és következtetés

Most azt szeretnénk kipróbálni, hogy a szingulettünk működőképes -e, és ez azt jelenti, hogy a 6. lépésben leírtak szerint hívjuk meg a nyilvános függvényeket, és azt javasoljuk, hogy állítson be töréspontokat, hogy átlépjen a kódján, és ellenőrizze, hogy az egyes kellene lennie. A kiindulópontunk a projekt main.cpp -jében lesz, a main.cpp pedig most úgy néz ki, mint az alábbi kép.

Gratulálunk! Most fejezte be a Singleton Design Pattern első megvalósítását. Ezzel a tervezési mintával most számos módon egyszerűsítheti kódját. Például most készíthet olyan kezelőrendszereket, amelyek a program futási idején keresztül működnek, és amelyek statikus függvényeken keresztül érhetők el bárhol, ahol az osztályt szerepeltette.

A végső fejlécfájlnak úgy kell kinéznie, mint a 7.1. Az Ön singletonjához tartozó CPP -fájlnak úgy kell kinéznie, mint a 6.2. Fényképnek, és a fájl tetején a 8. lépésben látható kódot kell hozzáadni. Ez az utasítás az egyszerű Singleton Design Pattern felépítését nyújtotta.

Hibaelhárítási tanácsok:

Memóriával kapcsolatos hibákat kap?

Győződjön meg arról, hogy a 7. és a 8. lépésben ellenőrizte, hogy a ptrInstance nullptr értékre van -e állítva.

Végtelen ciklus fordul elő?

Győződjön meg arról, hogy a nyilvános funkciók definícióiban a privát függvényt hívják, nem ugyanazt a nyilvános funkciót.

Az egyszeren belül kiosztott objektumok memóriaszivárgást okoznak?

Győződjön meg róla, hogy a programkódon belül meghívja az egyszeres terminál funkcióját, és a szingleton destruktorában győződjön meg arról, hogy feloldotta a memóriához rendelt objektumok kiosztását az egyes kódon belül.