Мазмуну:

C ++ тилинде Singleton дизайнын кантип жасоо керек: 9 кадам
C ++ тилинде Singleton дизайнын кантип жасоо керек: 9 кадам

Video: C ++ тилинде Singleton дизайнын кантип жасоо керек: 9 кадам

Video: C ++ тилинде Singleton дизайнын кантип жасоо керек: 9 кадам
Video: 30 глупых вопросов java программисту 2024, Июнь
Anonim
C ++ тилинде Singleton дизайн үлгүсүн кантип жасоо керек
C ++ тилинде Singleton дизайн үлгүсүн кантип жасоо керек

Киришүү:

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

Синглтон дизайн үлгүсү объектке багытталган программист, программист жана оюн программисттери үчүн дизайн үлгүсүн билиши керек. Синглтон дизайн үлгүсү дагы ошол жердеги кодировкалоонун эң жөнөкөй үлгүлөрүнүн бири. Аны үйрөнүү келечекте башка, татаал, дизайн үлгүлөрүн үйрөнүүгө жардам берет. Бул ошондой эле программаңыздын кодун мүмкүн эмес деп ойлогондой тартипке келтирүүгө жардам берет.

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

Бул окуу куралы орто эсеп менен 10-15 мүнөткө созулат.

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

-Visual Studios (каалаган версиясы) иштей алган компьютер (PC же Mac болушу мүмкүн)

-Visual Studiosдо түзүлгөн жөнөкөй программа, сиз өзүңүздүн жеке ырыңызды сынап көрө аласыз

Эскертүү: Singleton дизайн үлгүсү IDE же коддоо интерфейсин колдогон башка C ++ боюнча жасалышы мүмкүн, бирок бул көрсөтмө үчүн биз Visual Studios Enterprise Edition колдонобуз.

1 -кадам: Header File жана CPP File менен классты түзүңүз

Header File жана CPP File менен классты түзүңүз
Header File жана CPP File менен классты түзүңүз
Header File жана CPP File менен классты түзүңүз
Header File жана CPP File менен классты түзүңүз

Бул эки файлды жана классты дароо түзүү үчүн, Visual Studiosдо долбооруңузду / программаңызды ачыңыз, чечим изилдөөчүгө өтүңүз, оң баскыч менен чыкылдатыңыз жана чычкан курсорунун жанында кутуча пайда болушу керек, "Кошуу" опциясын табыңыз, анын үстүнө, жана башка кутуча оңго көрүнүшү керек. Бул кутуда сиз "Жаңы пункт.." вариантын тапкыңыз келет, аны басыңыз жана төмөндөгү 1.1 сүрөтүнө окшош терезе пайда болушу керек. Бул терезеде сиз "C ++ классын" тандап, анан "Кошуу" баскычын басыңыз. Бул фото 1.2 сүрөтүнө окшош башка терезени ачат. Бул терезеде сиз класстын атын "Класстын аты" талаасына тересиз жана Visual Studios автоматтык түрдө файлдын атын класстын атынан коет. Бул көрсөтмөнүн максаты үчүн, биз классты "EngineDebugSingleton" деп атамакчыбыз, бирок ал тамгаларга негизделген ар кандай аталышы болушу мүмкүн. Эми "OK" баскычын басып, 2 -кадамга өтсөңүз болот.

Эскертүү: Чечимди изилдөөчү жана файлдар компьютериңизде сакталган жерде өзүнчө. Чечимди изилдөөчүдө эч нерсени жылдыруу же түзүү OS файл изилдөөчүсүнүн ичиндеги файлдарды жылдырбайт же иреттебейт. Файлдарды изилдөөчү тарабында файлдарды уюштуруунун коопсуз ыкмасы жок кылынат, бирок белгилүү бир файлдарды чечим изилдөөчүдөн жок кылбаңыз, ошол эле файлдарды каалаган жерге жылдырыңыз жана чечим изилдөөчүгө кайтыңыз, оң баскыч менен чыкылдатыңыз, "Кошуу" опциясын, андан кийин "Бар нерсени" жана жылдырылган файлдарды табыңыз. Башкы жана cpp файлын жылдырганыңызды текшериңиз.

2 -кадам: Конструкторду купуяга коюңуз

Конструкторду купуяга коюңуз
Конструкторду купуяга коюңуз

Жаңы түзүлгөн CPP файлы жана баш файлыңыз менен, эгер сиз аны түзгөндө автоматтык түрдө ачылбаса, анда чечим изилдөөчүгө өтүңүз жана чыкылдатыңыз "EngineDebugSingleton.h". Андан кийин сизди "EngineDebugSingleton ()", класс демейки конструктору жана "~ EngineDebugSingleton ()" класстын бузуучусу тосуп алышат. Бул кадам үчүн биз конструкторду купуяга коюуну каалайбыз, бул функция класска гана жеткиликтүү жана башка эч нерсе эмес. Муну менен, сиз класстын баш файлында жана класстын башка функцияларында гана, өзгөрмөнү жасай албайсыз же классты класстан тышкары эстутумга бөлө албайсыз. Конструктордун купуя болушу дизайн үлгүсүнүн жана синглондордун иштешинин ачкычы. Биз кийинки кадамдарда синглтон кантип жасаларын жана ага кантип жетүү мүмкүн экенин ачабыз.

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

3 -кадам: Кыйратуучуну купуяга коюңуз

Кыйратуучуну купуяга коюңуз
Кыйратуучуну купуяга коюңуз

Биз конструктор менен болгон сыяктуу

2 -кадам, бул кадам үчүн биз азыр деструкторду купуяга коёбуз. Конструктор сыяктуу эле, класстын өзүнөн башка эч нерсе класстын өзгөрмөлөрүн эсинен өчүрө албайт.

Бул кадамды бүтүргөндөн кийин класс азыр ушундай көрүнүшү керек. (Ассоциацияланган сүрөттү караңыз)

4 -кадам: Синглтондо статикалык көрсөткүч өзгөрмөсүн түзүү

Синглтондо статикалык көрсөткүч өзгөрмөсүн түзүү
Синглтондо статикалык көрсөткүч өзгөрмөсүн түзүү

Бул кадамда биз a түзөбүз

"EngineDebugSingleton*" түрүндөгү статикалык көрсөткүч өзгөрмөсү. Бул биздин синглтонубузду эстутумга бөлүү үчүн колдонула турган өзгөрмө болот жана биздин синглтон эстутумга бөлүнгөн убакыттын ичинде аны көрсөтөт.

Бул өзгөрмөнү түзгөндөн кийин, биздин баш файлы кандай болушу керек

5 -кадам: Instance Функциясын түзүү

Instance Функциясын түзүү
Instance Функциясын түзүү

Биз азыр мисал келтиргибиз келет

функция. Функция статикалык функция болушу керек жана биздин класска шилтемени кайтаргысы келет ("EngineDebugSingleton &"). Биз функцияны Instance () деп атаганбыз. Функциянын өзүндө, биз алгач ptrInstance == nullptr (! PtrInstanceке чейин кыскартылышы мүмкүн), эгер ал nullptr болсо, бул singleton бөлүнбөгөндүгүн жана if операторунун алкагына киргенин текшерүүнү каалайбыз. ptrInstance = new EngineDebugSingleton () кылуу менен бөлүшкүңүз келет. Бул жерде сиз синглонду эс тутумга бөлөсүз. If билдирүүсүнүн алкагынан чыккандан кийин, биз ptrInstance көрсөткөн нерсени кайтарып беребиз, ал "*ptrInstance" синтаксиси менен белгиленет. Биз статикалык коомдук функцияларыбызды жасоодо бул функцияны катуу колдонобуз, андыктан синглтон жаратылганын жана эстутумга бөлүнгөнүн текшере алабыз. Негизи, бул функция сизди класстын бир гана бөлүштүрүүсүнө ээ кылат жана мындан ары болбойт.

Instance () функциясын түзгөндөн кийин биздин класс азыр ушундай болушу керек. Көрүнүп тургандай, биз кылгандардын баары класстын жеке бөлүмүндө калды, бул кийинки кадамдарда бир аз өзгөрөт.

6 -кадам: Статикалык коомдук функцияларды түзүү

Статикалык коомдук функцияларды түзүү
Статикалык коомдук функцияларды түзүү
Статикалык коомдук функцияларды түзүү
Статикалык коомдук функцияларды түзүү
Статикалык коомдук функцияларды түзүү
Статикалык коомдук функцияларды түзүү

Функцияны түзгөндөн кийин

5 -кадам, сиз статикалык коомдук функцияларды жасай баштасаңыз болот. Ар бир коомдук функция аны менен бирге жүрүү үчүн жеке функцияга ээ болушу керек, бул функциянын аталышы бирдей боло албайт. Эмне үчүн функцияны статикалык кылуу керек? Биз коомдук функцияларды статикалык кылып жатабыз, ошондуктан аларга чыныгы объектсиз кирүүгө болот. Ошентип, "EngineDebugSingleObj-> SomeFunction ()" сыяктуу бир нерсе кылуунун ордуна, биз "EngineDebugSingleton:: Кээ бир Функция ()" кылабыз. Бул синглтонго коддун каалаган жерине кирүүгө мүмкүндүк берет, эгер сиз баш файлды сиз иштеп жаткан конкреттүү долбоор файлына киргизген болсоңуз. Муну менен сиз синглтонду анын коомдук функцияларынын бири аркылуу түзө аласыз.

Бул кадамда биздин максаттар үчүн биз эки коомдук статикалык боштук функцияларын түздүк, "кошуу ()" жана "алып салуу ()". Жеке бөлүмдө биз дагы эки функцияны аткарабыз, "PrivAdd ()" жана "PrivSubtract ()". Биз ошондой эле "NumberOfThings" деп аталган int өзгөрмөсүн коштук. Бул функциялардын аныктамасы биздин класстардын CPP файлына кирет. Функцияны CPP файлына оңой киргизүү үчүн, курсоруңуздун астында жашыл сызык болушу керек болгон функцияны белгилеп, "Left ALT + ENTER" баскычын басыңыз, ал сизге аныктаманы түзүүгө мүмкүнчүлүк берет. класстар менен байланышкан CPP файлы. Файл 6.1ди караңыз, башкы файл кандай болушу керек жана бардык функциялардын аныктамаларын түзгөндөн кийин, сиздин CPP Фото 6.2ге окшош болушу керек, бирок сиздин функция аныктамаларында код жок болот.

Эми сиз функция аныктамаларына Фото 6.2дегидей эле кодду кошкуңуз келет. Жогоруда айтылгандай, биздин коомдук милдеттерибиз Instance () функциясын колдонот, ал ptrInstance көрсөткөн нерсени кайтарат. Бул биздин класстын жеке функцияларын колдонууга мүмкүнчүлүк берет. Синглтондун коомдук функциясы менен, сиз Instance функциясын гана чакырышыңыз керек. Мунун бир гана өзгөчөлүгү - бул биздин Терминтациялоо функциясы.

Эскертүү: Бул кадамда көрсөтүлгөн так мамлекеттик жана жеке функциялардын кереги жок, сизде жеке функцияда ар кандай функциялардын аталыштары жана операциялары болушу мүмкүн, бирок коомдук функциянын бардык түрү үчүн аны менен бирге жүрүү үчүн жеке функция болушу керек. коомдук функция дайыма биздин учурда Instance () функциясын колдонушу керек.

7 -кадам: токтотуу функциясын түзүү

Терминация Функциясын түзүү
Терминация Функциясын түзүү
Терминация Функциясын түзүү
Терминация Функциясын түзүү

Биз өзүбүздүн синглтонубузду класстын ичинде гана бөлүштүрө ала тургандыктан, биз статикалык коомдук функцияны түзүшүбүз керек. Бул функция класстын деструкторун чакырган ptrInstance боюнча delete деп аталат, андан кийин ptrInstanceти nullptrге кайра койгубуз келет, ошондо ал сиздин программаңыз бүтпөсө кайра бөлүштүрүлүшү мүмкүн. Сиз ошондой эле Синглтондун жеке өзгөрмөлөрүнө бөлүштүрүлгөн эстутумду тазалоо үчүн Синглтонуңузду токтоткуңуз келет.

8 -кадам: PtrInstanceти Nullptrге коюу

PtrInstance'ти Nullptrге коюу
PtrInstance'ти Nullptrге коюу

Синглонду аягына чыгаруу үчүн, EngineDebugSingleton. CPP файлына өтүүнү каалайсыз жана CPP файлынын жогору жагында, биздин мисалда, "EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr."

Муну кылуу менен ptrInstance nullptr болот, андыктан мисал функциясын биринчи жолу өткөргөндө, биздин класс эстутумга бөлүштүрүлөт. Ансыз сиз ката кетиришиңиз мүмкүн, анткени сиз ага эч нерсе бөлүнбөгөн эс тутумуна кирүүгө аракет кыласыз.

9 -кадам: Тест жана Жыйынтык

Тест жана Жыйынтык
Тест жана Жыйынтык

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

Куттуктайм! Сиз Singleton Дизайн Үлгүсүнүн биринчи ишке ашуусун аяктадыңыз. Бул дизайн үлгүсү менен, сиз азыр кодуңузду ар кандай жолдор менен иретке келтире аласыз. Мисалы, сиз азыр программаңыздын иштөө убактысында иштеген башкаруучу системаларды жасай аласыз, ага класс кошкон жерде статикалык функциялар аркылуу кирүүгө болот.

Акыркы баш файлыңыз 7.1 -сүрөткө окшош болушу керек. Сиздин синглтон менен байланышкан CPP файлы 8 -кадамда көрсөтүлгөн коддун үстүнө Файл 6.2ге окшош болушу керек. Бул көрсөтмө сизге Singleton Design Patternдин жөнөкөй түзүлүшүн берди.

Көйгөйлөрдү чечүү кеңеши:

Эстутумга байланыштуу каталар келип жатабы?

PtrInstanceти nullptr деп коюп жатканыңызга ынануу үчүн 7 -кадамга жана 8 -кадамга кайрылганыңызды текшериңиз.

Чексиз цикл пайда болдубу?

Коомдук функциялардын аныктыгын текшериңиз, алардын аныктамаларында сиз бир эле коомдук функцияны эмес, жеке функцияны чакырып жатасыз.

Синглтон ичинде бөлүнгөн объекттер эс тутумдун агышына алып келет?

Программалык кодуңузга ылайыктуу учурда синглтонуңуздун токтотуу функциясын чакырганыңызды текшериңиз жана синглтонуңуздун деструкторунда, синглтон кодунун чегинде эс тутумга бөлүнгөн бардык объектилерди ажыратууну тактаңыз.