Мазмұны:

C ++ тілінде Singleton дизайн үлгісін қалай жасауға болады: 9 қадам
C ++ тілінде Singleton дизайн үлгісін қалай жасауға болады: 9 қадам

Бейне: C ++ тілінде Singleton дизайн үлгісін қалай жасауға болады: 9 қадам

Бейне: C ++ тілінде Singleton дизайн үлгісін қалай жасауға болады: 9 қадам
Бейне: Уроки С++. Порождающий паттерн. Одиночка(singleton) 2024, Маусым
Anonim
C ++ - те Singleton дизайн үлгісін қалай жасауға болады
C ++ - те Singleton дизайн үлгісін қалай жасауға болады

Кіріспе:

Бұл нұсқаулықтың мақсаты - пайдаланушыға C ++ бағдарламасында синглондық дизайн үлгісін қалай енгізу керектігін үйрету. Бұл нұсқаулықтар жиынтығы оқырманға синглтонның элементтері неге екенін және кодтың қалай өңделетінін түсіндіреді. Осыны біле отырып, болашақта сіздің синглондарыңызды түзетуге көмектеседі. Синглондық дизайн үлгісі қандай? Синглтондық дизайн үлгісі - бұл кодер тек бір рет жасалатын сыныпты құратын дизайн үлгісі, егер сіз басқа тақырыптық файлдарға тақырып файлын қосқан болсаңыз, сыныптардың қоғамдық функцияларына кез келген жерден қол жеткізуге болады.

Синглондық дизайн үлгісі кез келген объектіге бағдарланған бағдарламашының, бағдарламалық жасақтаманың бағдарламашыларының және ойын бағдарламашыларының дизайн үлгісін білуі керек. Синглондық дизайн үлгісі - бұл кодтаудың ең қарапайым үлгілерінің бірі. Оны үйрену сізге болашақта басқа, қиынырақ дизайн үлгілерін үйренуге көмектеседі. Сондай -ақ, бұл сіздің бағдарламаңыздың кодын мүмкін емес деп ойластыруға көмектеседі.

Синглондық дизайн үлгісінің қиындығы басқа дизайн үлгілерімен салыстырғанда оңай болғанымен, бұл нұсқаулық жиынтығы орташа қиындыққа ие. Бұл дегеніміз, бұл нұсқауларды орындау үшін сізге C ++ синтаксисінің негізгі және қосымша талаптарын білуді ұсынамыз. Сіз сондай -ақ C ++ кодтау этикетін білуіңіз керек (яғни сынып айнымалысын жеке ұстаңыз, тақырып файлына бір сынып және т.б.). Сіз сондай -ақ жадыны қалай босату керектігін және C ++ - те конструкторлар мен деструкторлардың қалай жұмыс істейтінін білуіңіз керек.

Бұл нұсқаулық орта есеппен 10-15 минутты алады.

Материалдық талаптар:

-Visual Studios (кез келген нұсқасы) жұмыс істей алатын компьютер (компьютер немесе Mac болуы мүмкін)

-Visual Studio студиясында жасалған, синглтонды тексеруге болатын қарапайым бағдарлама

Ескертпе: синглтондық дизайн үлгісі IDE немесе кодтау интерфейсін қолдайтын кез келген басқа C ++ тілінде орындалуы мүмкін, бірақ бұл нұсқаулық үшін біз Visual Studios Enterprise Edition қолданамыз.

1 -қадам: Тақырып файлы мен CPP файлы бар сыныпты жасаңыз

Тақырыптық файлмен және CPP файлымен өз сыныбыңызды құрыңыз
Тақырыптық файлмен және CPP файлымен өз сыныбыңызды құрыңыз
Тақырыптық файлмен және CPP файлымен өз сыныбыңызды құрыңыз
Тақырыптық файлмен және CPP файлымен өз сыныбыңызды құрыңыз

Бұл екі файлды және сыныпты бірден жасау үшін Visual Studios -та жобаңызды / бағдарламаңызды ашыңыз, шешім зерттеушісіне өтіңіз, тінтуірдің оң жақ түймешігімен нұқыңыз және тышқан курсорының жанында қорап пайда болуы керек, «Қосу» опциясын тауып, апарыңыз. оның үстінде және оң жақта басқа қорап пайда болуы керек. Бұл өрісте сіз «Жаңа элемент..» опциясын тапқыңыз келеді, оны басыңыз және төмендегі 1.1 фотосуретіне ұқсас терезе пайда болады. Бұл терезеде «C ++ класын» таңдап, «Қосу» түймесін басыңыз. Бұл 1.2 фотосуретіне ұқсас басқа терезені ашады. Бұл терезеде сіз «Сынып атауы» өрісіне сыныптың атын енгізесіз, ал Visual Studios автоматты түрде нақты файлға сынып атауын береді. Бұл нұсқаулықта біз өз сыныбымызды «EngineDebugSingleton» деп атаймыз, бірақ бұл әріпке негізделген кез келген атау болуы мүмкін. Енді сіз «OK» түймесін басып, 2 -қадамға өтуіңізге болады.

Ескерту: Шешімдерді зерттеуші мен файлдар компьютерде сақталатын орын бөлек. Шешім зерттеушісінде ештеңені жылжыту немесе жасау ОЖ файл зерттеушісіндегі файлдарды жылжытпайды немесе реттемейді. Файлдарды зерттеуші жағында файлдарды ұйымдастырудың қауіпсіз әдісі жойылады, бірақ белгілі бір файлдарды шешім зерттеушісінен жоймайды, сол файлдарды шолғыштағы қажетті орынға жылжытады, содан кейін шешім зерттеушісіне қайтып оралады, тінтуірдің оң жақ түймешігімен, «Қосу» опциясын, содан кейін «Бар элементті» тауып, жылжытылған файлдарды табыңыз. Тақырыпты және cpp файлын жылжытқаныңызға көз жеткізіңіз.

2 -қадам: Конструкторды жеке күйге орнатыңыз

Конструкторды жеке күйге орнатыңыз
Конструкторды жеке күйге орнатыңыз

Жаңадан құрылған CPP файлы мен тақырып файлымен, егер сіз оны жасаған кезде ол автоматты түрде ашылмаса, шешім зерттеушісіне өтіп, «EngineDebugSingleton.h» түймесін басып, ашыңыз. Содан кейін сізді «EngineDebugSingleton ()», сыныптың әдепкі конструкторы және «~ EngineDebugSingleton ()» сынып бұзушысы қарсы алады. Бұл қадам үшін біз конструкторды жеке күйге орнатқымыз келеді, бұл бұл функция тек сыныпқа қол жетімді екенін білдіреді және басқа ештеңе жоқ. Бұл жағдайда сіз айнымалы жасай алмайсыз немесе сыныпты сыныптан тыс жадқа бөле алмайсыз, тек сыныптардың тақырыптық файлында және сыныптардың басқа функцияларында. Конструктордың жеке болуы - дизайн үлгісі мен синглтондардың жұмыс істеуінің кілті. Біз алдағы қадамдарда синглтонның қалай жасалатынын және оған қалай қол жеткізілетінін анықтайтын боламыз.

Конструкторды жеке күйге көшіргеннен кейін сынып осылай болуы керек (байланысты фотосуретті қараңыз)

3 -қадам: жойғышты жеке күйге орнатыңыз

Деструкторды жеке күйге орнатыңыз
Деструкторды жеке күйге орнатыңыз

Біз конструктормен жасаған сияқты

2 -қадам, бұл қадам үшін біз қазір жойғышты жеке күйге қоямыз. Конструктор сияқты, сыныптың өзінен басқа ештеңе сыныптың айнымалыларын жадынан өшіре алмайды.

Бұл қадамды аяқтағаннан кейін сынып келесідей болуы керек. (Байланысты суретті қараңыз)

4 -қадам: Синглтонда статикалық көрсеткіш айнымалысын құру

Синглтонда статикалық көрсеткіш айнымалысын құру
Синглтонда статикалық көрсеткіш айнымалысын құру

Бұл қадамда біз a жасаймыз

«EngineDebugSingleton*» типті статикалық көрсеткіштің айнымалысы. Бұл біздің синглтонды жадқа бөлетін және біздің синглтон жадқа бөлінген уақыт ішінде көрсететін айнымалы болады.

Бұл айнымалы мәнді жасағаннан кейін біздің тақырыптық файл осындай болуы керек

5 -қадам: Instance функциясын құру

Instance функциясын құру
Instance функциясын құру

Біз қазір мысал жасағымыз келеді

функция. Функция статикалық функция болуы керек және біздің сыныпқа сілтемені қайтарғысы келеді («EngineDebugSingleton &»). Біз өз функциямызды Instance () деп атадық. Функцияның өзінде біз алдымен ptrInstance == nullptr (! PtrInstance -ге дейін қысқартуға болады), егер ол nullptr болса, бұл синглтон бөлінбегенін және if операторының ауқымында екенін тексергіміз келеді. ptrInstance = new EngineDebugSingleton () арқылы бөлгіңіз келеді. Бұл жерде сіз синглтонды жадқа бөлесіз. If операторының ауқымынан шыққаннан кейін, біз ptrInstance көрсететін нәрсені қайтарамыз, ол «*ptrInstance» синтаксисімен белгіленеді. Біз статикалық жалпыға ортақ функцияларды жасау кезінде бұл функцияны өте көп қолданатын боламыз, сондықтан синглтонның құрылып, жадқа бөлінгенін тексере аламыз. Шын мәнінде, бұл функция сізге сыныпты бір ғана бөлуге мүмкіндік береді және бұдан артық болмайды.

Біздің класс Instance () функциясын жасағаннан кейін дәл осылай болуы керек. Көріп отырғаныңыздай, біз жасағанның бәрі сыныптың жеке бөлімінде қалды, бұл келесі қадамдарда аздап өзгереді.

6 -қадам: Тұрақты қоғамдық функцияларды құру

Тұрақты қоғамдық функцияларды құру
Тұрақты қоғамдық функцияларды құру
Тұрақты қоғамдық функцияларды құру
Тұрақты қоғамдық функцияларды құру
Тұрақты қоғамдық функцияларды құру
Тұрақты қоғамдық функцияларды құру

Сіз функцияны жасағаннан кейін

5 -қадамда сіз статикалық жалпы функцияларды жасай аласыз. Әрбір қоғамдық функцияның онымен бірге жүретін жеке функциясы болуы керек, бұл функцияның атауы бірдей бола алмайды. Неліктен функцияны статикалық ету керек? Біз қоғамдық функцияларды статикалық етіп жасаймыз, сондықтан оларға нақты объектісіз қол жеткізуге болады. Сонымен, «EngineDebugSingleObj-> SomeFunction ()» сияқты нәрсенің орнына біз «EngineDebugSingleton:: Кейбір функция ()» жасаймыз. Бұл синглтонға кодтың кез келген жерінен қол жеткізуге мүмкіндік береді, егер сіз тақырып файлын сіз жұмыс істеп жатқан нақты жоба файлына енгізген болсаңыз. Осының көмегімен сіз синглтонды оның кез келген қоғамдық функциялары арқылы жасай аласыз.

Біздің мақсатымыз үшін бұл қадамда біз екі жалпы статикалық бос функцияны құрдық: «қосу ()» және «шегеру ()». Жеке бөлімде бізде тағы екі функция бар, «PrivAdd ()» және «PrivSubtract ()». Біз сонымен қатар «NumberOfThings» деп аталатын int айнымалысын қостық. Бұл функциялардың анықтамасы біздің сыныптардың CPP файлында болады. Функцияны CPP файлына оңай түсіру үшін, курсордың астында жасыл жолақ болатын функцияны ерекшелеп, «Сол жақ ALT + ENTER» батырмасын бассаңыз, ол сізге анықтаманы құруға мүмкіндік береді. сыныптардың байланысты CPP файлы. Тақырып файлы қандай болу керектігін білу үшін 6.1 -суретті қараңыз және барлық функция анықтамаларын жасағаннан кейін сіздің CPP 6.2 суреті сияқты болуы керек, тек сіздің функция анықтамаларында код жоқ.

Енді сіз функцияның анықтамаларына Фото 6.2 -дегідей кодты қосқыңыз келеді. Жоғарыда айтылғандай, біздің қоғамдық функцияларымыз Instance () функциясын қолданады, бұл ptrInstance көрсеткен нәрсені қайтарады. Бұл біздің сыныптың жеке функцияларына қол жеткізуге мүмкіндік береді. Кез келген синглтонның қоғамдық функциясында сіз тек Instance функциясын шақыруыңыз керек. Бұған жалғыз ерекшелік - біздің Терминаттау функциясы.

Ескерту: Бұл қадамда көрсетілген жалпыға ортақ және жеке функциялар қажет емес, сізде жеке функцияда әр түрлі функция атаулары мен операциялары болуы мүмкін, бірақ жалпы функцияның кез келген түрі үшін онымен бірге жүру үшін жеке функция болуы керек. қоғамдық функция әрқашан біздің жағдайда Instance () функциясын қолдануы керек.

7 -қадам: Аяқтау функциясын құру

Аяқтау функциясын құру
Аяқтау функциясын құру
Аяқтау функциясын құру
Аяқтау функциясын құру

Біз өзіміздің синглтонды тек сыныптан бөле алатындықтан, біз статикалық қоғамдық функцияны құруымыз керек. Бұл функция сынып деструкторын шақыратын ptrInstance -те delete деп атайды, содан кейін біз ptrInstance параметрін nullptr -ге қайта орнатқымыз келеді, сондықтан сіздің бағдарламаңыз аяқталмаса, оны қайта бөлуге болады. Сіз сондай -ақ Singleton -тың жеке айнымалыларында бөлінген кез келген жадты тазарту үшін Singletons -ты тоқтатқыңыз келеді.

8 -қадам: PtrInstance параметрін Nullptr күйіне орнату

PtrInstance параметрін Nullptr күйіне орнату
PtrInstance параметрін Nullptr күйіне орнату

Синглонды аяқтау үшін сіз EngineDebugSingleton. CPP файлына және CPP файлының жоғарғы жағына өткіңіз келеді, біздің жағдайда «EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr» деп теріңіз.

Бұл әрекетті орындау кезінде бастапқыда ptrInstance nullptr болады, сондықтан сіз экземпляр функциясын бірінші рет өткізген кезде біздің класс жадқа бөлінуге рұқсат етіледі. Онсыз сіз қате аласыз, себебі сіз оған бөлінбеген жадқа кіруге тырысасыз.

9 -қадам: Тест және қорытынды

Тест және қорытынды
Тест және қорытынды

Біз енді синглтонның жұмыс істейтініне көз жеткізу үшін тестілеуді өткізгіміз келеді, бұл бізге 6 -қадамда сипатталғандай жалпыға ортақ функцияларды шақыруды талап етеді және кодты тексеріп, синглтонның қалай жұмыс істейтінін көру үшін тоқтау нүктелерін орнатуды ұсынамыз. болуы керек. Біздің бастапқы нүктеміз біздің жобаның main.cpp -де болады және біздің main.cpp енді төмендегі суретке ұқсайды.

Құттықтаймын! Сіз Singleton Design Pattern бағдарламасын бірінші рет енгіздіңіз. Осы дизайн үлгісімен сіз енді кодты әр түрлі жолдармен реттей аласыз. Мысалы, сіз енді бағдарламаның жұмыс уақытында жұмыс істейтін басқарушы жүйелер жасай аласыз, оларға сынып қосылған кез келген жерде статикалық функциялар арқылы қол жеткізуге болады.

Сіздің соңғы тақырыптық файлыңыз 7.1 суретке ұқсас болуы керек. Сіздің синглтонның байланысқан CPP файлы 8 -қадамда көрсетілген кодты файлдың жоғарғы жағына қосу арқылы Фото 6.2 сияқты болуы керек. Бұл нұсқаулық сізге Singleton Design Pattern қарапайым құрылымын ұсынды.

Ақаулықтарды жою бойынша кеңес:

Жадқа қатысты қателер пайда болды ма?

PtrInstance параметрін nullptr деп орнатқаныңызға көз жеткізу үшін 7 -ші және 8 -ші қадамдарға сілтеме жасағаныңызға көз жеткізіңіз.

Шексіз цикл пайда болады?

Жалпы функцияларды тексеріңіз, олардың анықтамаларында сіз ортақ функцияны емес, жеке функцияны шақырасыз.

Синглтонда бөлінген объектілер жадтың ағып кетуіне әкеледі?

Бағдарлама коды шегінде синглтонның тоқтату функциясын шақырғаныңызға көз жеткізіңіз және синглтонның деструкторында синглтон коды шеңберінде жадқа бөлінген кез келген нысанды ажыратпағаныңызға көз жеткізіңіз.