ዝርዝር ሁኔታ:

በ C ++ ውስጥ የ Singleton ዲዛይን ንድፍ እንዴት እንደሚደረግ: 9 ደረጃዎች
በ C ++ ውስጥ የ Singleton ዲዛይን ንድፍ እንዴት እንደሚደረግ: 9 ደረጃዎች

ቪዲዮ: በ C ++ ውስጥ የ Singleton ዲዛይን ንድፍ እንዴት እንደሚደረግ: 9 ደረጃዎች

ቪዲዮ: በ C ++ ውስጥ የ Singleton ዲዛይን ንድፍ እንዴት እንደሚደረግ: 9 ደረጃዎች
ቪዲዮ: በ6 ወር ውስጥ programmer የሆነው የ13 ዓመቱ ታዳጊ - ኒቆዲሞስ ኤልያስ 2024, ሰኔ
Anonim
በ C ++ ውስጥ የነጠላቶን ንድፍ ንድፍ እንዴት እንደሚሠራ
በ C ++ ውስጥ የነጠላቶን ንድፍ ንድፍ እንዴት እንደሚሠራ

መግቢያ ፦

የዚህ መመሪያ መመሪያ ዓላማ በ C ++ ፕሮግራማቸው ውስጥ የነጠላቶን ንድፍ ንድፍ እንዴት ተግባራዊ ማድረግ እንደሚቻል ለተጠቃሚው ማስተማር ነው። ይህን በሚያደርግበት ጊዜ ፣ ይህ የመማሪያ ስብስብ የአንቶንቶን አካላት ለምን እንደሆኑ እና ኮዱ እንዴት እንደሚሠራ ለአንባቢው ያብራራል። ይህንን በማወቅ ፣ የወደፊት ነጠላ ነጥቦችን በማረም ለወደፊቱ ይረዳል። የነጠላቶን ንድፍ ንድፍ ምንድነው? በሌሎች የፕሮጀክት ተዛማጅ ፋይሎች ውስጥ የራስጌ ፋይልን #ካካተቱ የ ነጠላተን ዲዛይን ንድፍ ኮዴደር አንድ ጊዜ ብቻ ሊነቃ የሚችል ክፍል የሚፈጥርበት የንድፍ ንድፍ ነው ፣ የክፍሎቹ የሕዝብ ተግባራት በመሠረቱ በየትኛውም ቦታ ሊደረስባቸው ይችላሉ።

የነጠላቶን ንድፍ ንድፍ ለማንኛውም ነገር ተኮር የፕሮግራም አዘጋጅ ፣ የሶፍትዌር ፕሮግራም አድራጊዎች እና የጨዋታ ፕሮግራም አድራጊዎች ማወቅ ያለበት የዲዛይን ንድፍ ነው። የነጠላቶን ንድፍ ንድፍ እንዲሁ እዚያ ከሚገኙት ቀላሉ የኮድ ዲዛይን ንድፎች አንዱ ነው። እሱን መማር ሌላ ፣ የበለጠ አስቸጋሪ ፣ የንድፍ ንድፎችን ለወደፊቱ እንዲማሩ ይረዳዎታል። እንዲሁም የፕሮግራምዎን ኮድ ሊቻል በማይችሉበት መንገድ ለማስተካከል ይረዳዎታል።

ከሌሎች የዲዛይን ንድፎች ጋር ሲነጻጸር የነጠላ ዲዛይን ንድፍ ችግር ቀላል ቢሆንም ፣ ይህ የመማሪያ ስብስብ መካከለኛ ችግር አለው። ይህ ማለት እነዚህን መመሪያዎች ለማድረግ ፣ የ C ++ መሰረታዊ እና የቅድሚያ አገባብ መስፈርቶችን እንዲያውቁ እንመክራለን። እንዲሁም ትክክለኛውን የ C ++ ኮድ ሥነ -ምግባርን ማወቅ አለብዎት (ማለትም የክፍል ተለዋዋጮችን በግል ያቆዩ ፣ አንድ የራስጌ ፋይል አንድ ክፍል ወዘተ)። እንዲሁም ማህደረ ትውስታን እንዴት እንደሚያስለቅቁ እና በ C ++ ውስጥ ግንበኞች እና አጥፊዎች እንዴት እንደሚሠሩ ማወቅ አለብዎት።

ይህ የመማሪያ መመሪያ በአማካይ ከ10-15 ደቂቃዎች ይወስዳል።

የቁሳቁስ መስፈርቶች

-ቪዥዋል ስቱዲዮዎችን (ማንኛውንም ስሪት) ለማሄድ የሚችል ኮምፒተር (ፒሲ ወይም ማክ ሊሆን ይችላል)

-ነጠላዎን ሊፈትኑት የሚችሉት በእይታ ስቱዲዮዎች ውስጥ የተፈጠረ ቀላል ፕሮግራም

ማሳሰቢያ -የነጠላቶን ንድፍ ንድፍ በማንኛውም ሌላ C ++ በሚደግፍ አይዲኢ ወይም በኮድ በይነገጽ ላይ ሊከናወን ይችላል ፣ ግን ለዚህ የማስተማሪያ ስብስብ እኛ የእይታ ስቱዲዮ ኢንተርፕራይዝ እትምን እንጠቀማለን።

ደረጃ 1: ክፍልዎን ይፍጠሩ ፣ በአርዕስት ፋይል እና በሲፒፒ ፋይል

በአርዕስት ፋይል እና በሲፒፒ ፋይል ክፍልዎን ይፍጠሩ
በአርዕስት ፋይል እና በሲፒፒ ፋይል ክፍልዎን ይፍጠሩ
በአርዕስት ፋይል እና በሲፒፒ ፋይል ክፍልዎን ይፍጠሩ
በአርዕስት ፋይል እና በሲፒፒ ፋይል ክፍልዎን ይፍጠሩ

እነዚህን ሁለት ፋይሎች እና ክፍሉን በአንድ ጊዜ ለመፍጠር ፣ ፕሮጀክትዎን / ፕሮግራምዎን በቪዥዋል ስቱዲዮዎች ውስጥ ይክፈቱ ፣ ወደ መፍትሄ አሳሽ ይሂዱ ፣ በቀኝ ጠቅ ያድርጉ እና ሳጥን በመዳፊት ጠቋሚዎ አጠገብ መታየት አለበት ፣ “አክል” የሚለውን አማራጭ ያግኙ ፣ ያንዣብቡ በላዩ ላይ ፣ እና ሌላ ሳጥን በቀኝ በኩል መታየት አለበት። በዚህ ሳጥን ውስጥ “አዲስ ንጥል..” የሚለውን አማራጭ ማግኘት ይፈልጋሉ ፣ ጠቅ ያድርጉት እና ከዚህ በታች ያለውን ፎቶ 1.1 ምስል የሚመስል መስኮት መታየት አለበት። በዚህ መስኮት ውስጥ “C ++ Class” ን መምረጥ እና ከዚያ “አክል” ን መምታት ይፈልጋሉ። ይህ ፎቶውን 1.2 ምስል የሚመስል ሌላ መስኮት ይከፍታል። በዚህ መስኮት ውስጥ በ “የክፍል ስም” መስክ ውስጥ በክፍልዎ ስም ይተይቡ እና ቪዥዋል ስቱዲዮዎች ከትክክለኛ ስም በኋላ ትክክለኛውን ፋይል በራስ -ሰር ይሰይማሉ። ለዚህ ትምህርት ዓላማ የእኛን ክፍል “EngineDebugSingleton” ብለን እንሰይማለን ፣ ግን ማንኛውም ፊደል ላይ የተመሠረተ ስም ሊሆን ይችላል። አሁን “እሺ” ን ጠቅ ማድረግ እና ወደ ደረጃ 2 መቀጠል ይችላሉ።

ማሳሰቢያ - የመፍትሄ አሳሽ እና በኮምፒተርዎ ላይ ፋይሎቹ የተቀመጡበት ቦታ የተለየ ነው። በመፍትሔ አሳሽ ውስጥ ማንኛውንም ነገር ማንቀሳቀስ ወይም መፍጠር በእርስዎ OS ፋይል አሳሽ ውስጥ ያሉትን ፋይሎች አይንቀሳቀስም ወይም አያደራጅም። በፋይል አሳሽ በኩል ፋይሎችዎን ለማደራጀት አስተማማኝ መንገድ ይወገዳል ፣ ግን የተወሰኑ ፋይሎችን ከመፍትሔ አሳሽ አይሰርዝም ፣ በፋይል አሳሽ ውስጥ ያሉትን ተመሳሳይ ፋይሎች ወደሚፈለገው ቦታ ያንቀሳቅሱ እና ከዚያ ወደ መፍትሄ አሳሽ ይመለሱ ፣ በቀኝ ጠቅ ያድርጉ ፣ “አክል” የሚለውን አማራጭ ይፈልጉ ፣ ከዚያ “ነባር ንጥል” ን ያግኙ እና ያንቀሳቅሷቸውን ፋይሎች ያግኙ። ሁለቱንም የራስጌ እና የ cpp ፋይል ማንቀሳቀሱን ያረጋግጡ።

ደረጃ 2 የግንባታውን ወደ የግል ያዘጋጁ

ገንቢውን ወደ የግል ያዘጋጁ
ገንቢውን ወደ የግል ያዘጋጁ

በአዲሱ በተፈጠረው የ CPP ፋይል እና የራስጌ ፋይል ፣ ሲፈጥሩት በራስ -ሰር ካልከፈተ ወደ መፍትሄ አሳሽ ይሂዱ እና ጠቅ ያድርጉ እና “EngineDebugSingleton.h” ን ይክፈቱ። ከዚያ በ “EngineDebugSingleton ()” ፣ በክፍል ነባሪው ገንቢ እና “~ EngineDebugSingleton ()” ክፍል አጥፊ ሰላምታ ይሰጡዎታል። ለዚህ ደረጃ ፣ ገንቢውን ለግል ማዘጋጀት እንፈልጋለን ፣ ይህ ማለት ይህ ተግባር ለክፍሉ ብቻ የሚገኝ እና ሌላ ምንም ማለት አይደለም። በዚህ ፣ በክፍል ራስጌ ፋይል እና በክፍሎቹ ሌሎች ተግባራት ውስጥ ብቻ ፣ ተለዋዋጭ ማድረግ ወይም ክፍሉን ከክፍል ውጭ ለማስታወስ መመደብ አይችሉም። ግንበኛውን በግል መያዙ ለዲዛይን ንድፍ እና ነጠላዎች እንዴት እንደሚሠሩ ቁልፍ ነው። አንድ ነጠላ ዜማ እንዴት በቅጽበት እንደሚደረግ እና እንደሚደረስ በሚቀጥሉት ደረጃዎች እናገኛለን።

ገንቢውን ወደ የግል ካዘዋወሩ በኋላ ክፍሉ አሁን እንደዚህ መሆን አለበት (ተጓዳኝ ፎቶውን ይመልከቱ)

ደረጃ 3 አጥፊውን ለግል ያዘጋጁ

አጥፊውን ለግል ያዘጋጁ
አጥፊውን ለግል ያዘጋጁ

ልክ በገንቢው ውስጥ እንዳደረግነው

ደረጃ 2 ፣ ለዚህ ደረጃ ፣ አሁን አጥፊውን ወደ የግል እናዘጋጃለን። ልክ እንደ ግንበኛው ፣ ከክፍሉ ራሱ በስተቀር ፣ ማንኛውንም የክፍል ተለዋዋጮች ከማስታወስ መሰረዝ አይችልም።

ይህንን ደረጃ ከጨረሱ በኋላ ክፍሉ አሁን እንደዚህ መሆን አለበት። (ተጓዳኝ ፎቶውን ይመልከቱ)

ደረጃ 4: በነጠላቶን ውስጥ የማይንቀሳቀስ ጠቋሚ ተለዋዋጭ መፍጠር

በነጠላቶን ውስጥ የማይንቀሳቀስ ጠቋሚ ተለዋዋጭ መፍጠር
በነጠላቶን ውስጥ የማይንቀሳቀስ ጠቋሚ ተለዋዋጭ መፍጠር

በዚህ ደረጃ እኛ እንፈጥራለን ሀ

“EngineDebugSingleton*” ዓይነት የማይንቀሳቀስ ጠቋሚ ተለዋዋጭ። ይህ የእኛ ነጠላ ዜማችንን ወደ ማህደረ ትውስታ የሚመድብ እና የእኛ ብቸኛ ለማህደረ ትውስታ በሚመደብበት ጊዜ ሁሉ የሚያመለክተው ተለዋዋጭ ይሆናል።

ይህንን ተለዋዋጭ ከፈጠሩ በኋላ የእኛ የራስጌ ፋይል ምን መሆን አለበት

ደረጃ 5 - የፈጣን ተግባርን መፍጠር

የፈጣን ተግባርን መፍጠር
የፈጣን ተግባርን መፍጠር

አሁን አንድ ምሳሌ ማድረግ እንፈልጋለን

ተግባር። ተግባሩ የማይንቀሳቀስ ተግባር መሆን አለበት እና ማጣቀሻ ወደ ክፍላችን (“EngineDebugSingleton &”) መመለስ ይፈልጋል። እኛ ተግባራችንን Instance () ብለን ጠራነው። በተግባሩ ራሱ ፣ ptrInstance == nullptr (ማሳጠር የሚቻል ከሆነ! PtrInstance) ፣ የማይሻር ከሆነ ፣ ይህ ማለት ነጠላውኑ አልተመደበም እና በአረፍተ ነገሩ ወሰን ውስጥ እኛ ለመሞከር እንፈልጋለን። ptrInstance = new EngineDebugSingleton () በማድረግ መመደብ ይፈልጋሉ። በእውነቱ ነጠላውን ወደ ማህደረ ትውስታ የሚመድቡት እዚህ ነው። የአረፍተ ነገሩን ወሰን ከወጣን በኋላ “*ptrInstance” በሚለው አገባብ የሚያመለክተው ptrInstance የሚያመለክተውን እንመልሳለን። የማይንቀሳቀስ የህዝብ ተግባሮቻችንን ስንሠራ ይህንን ተግባር በከፍተኛ ሁኔታ እንጠቀማለን ፣ ስለዚህ ነጠላው የተፈጠረ እና ለማስታወስ የተመደበ መሆኑን ለማየት ማረጋገጥ እንችላለን። በመሰረቱ ፣ ይህ ተግባር የክፍሉ አንድ ምደባ ብቻ እንዲኖርዎት እና ከእንግዲህ እንዲኖርዎት ያደርገዋል።

የ Instance () ተግባርን ከፈጠሩ በኋላ የእኛ ክፍል አሁን ምን መምሰል አለበት። እንደሚመለከቱት ፣ ያደረግነው ሁሉ በክፍል የግል ክፍል ውስጥ ቆይቷል ፣ ይህ በሚቀጥሉት ጥቂት ደረጃዎች ውስጥ ትንሽ ይቀየራል።

ደረጃ 6 - የማይንቀሳቀስ የህዝብ ተግባሮችን መፍጠር

የማይንቀሳቀስ የህዝብ ተግባሮችን መፍጠር
የማይንቀሳቀስ የህዝብ ተግባሮችን መፍጠር
የማይንቀሳቀስ የህዝብ ተግባሮችን መፍጠር
የማይንቀሳቀስ የህዝብ ተግባሮችን መፍጠር
የማይንቀሳቀስ የህዝብ ተግባሮችን መፍጠር
የማይንቀሳቀስ የህዝብ ተግባሮችን መፍጠር

ተግባሩን ከሠሩ በኋላ

ደረጃ 5 ፣ የማይለዋወጥ የህዝብ ተግባሮችን መስራት መጀመር ይችላሉ። እያንዳንዱ የህዝብ ተግባር ከእሱ ጋር አብሮ የሚሄድ የግል ተግባር ሊኖረው ይገባል ፣ የዚህ ተግባር ስም አንድ ሊሆን አይችልም። ለምን ተግባሩን የማይንቀሳቀስ ያደርገዋል? ያለ ተጨባጭ ነገር እንዲደርሱባቸው የህዝብ ተግባሮቹን የማይለዋወጥ እያደረግን ነው። ስለዚህ እንደ “EngineDebugSingleObj-> SomeFunction ()” ያለ ነገር ከማድረግ ይልቅ “EngineDebugSingleton:: Some Function ()” ን እናደርጋለን። እርስዎ በሚሰሩበት የተወሰነ የፕሮጀክት ፋይል ውስጥ #የራስጌ ፋይልን #ካካተቱ ይህ ነጠላ / ኮድ በኮድ ውስጥ በማንኛውም ቦታ እንዲገኝ ያስችለዋል። በዚህ ፣ በማንኛውም ነጠላ የህዝብ ተግባሩ በኩል ነጠላ ዜናን መፍጠር ይችላሉ።

በዚህ ደረጃ ለኛ ዓላማዎች “አክል ()” እና “መቀነስ ()” ሁለት የህዝብ የማይንቀሳቀስ ባዶ ተግባራት ፈጥረናል። በግላዊ ክፍሉ ውስጥ እኛ ሁለት ተጨማሪ ተግባራት “PrivAdd ()” እና “PrivSubtract ()”። እንዲሁም “NumberOfThings” የተባለ ውስጣዊ ተለዋዋጭ አክለናል። የእነዚህ ተግባራት ትርጉም ወደ ክፍሎቻችን CPP ፋይል ውስጥ ይገባል። ተግባሩ በቀላሉ ወደ ሲፒፒ ፋይል እንዲገባ ለማድረግ ፣ ከሱ በታች አረንጓዴ መስመር ሊኖረው የሚገባውን ተግባር በጠቋሚውዎ ላይ ያደምቁ እና “ግራ ALT + ENTER” ን ይምቱ ፣ ትርጓሜውን በ ውስጥ ይፍጠሩ የሚለውን አማራጭ ይሰጥዎታል። የክፍሎች ተዛማጅ የሲፒፒ ፋይል። የራስጌ ፋይል ምን እንደሚመስል ለማየት እና ሁሉንም የተግባር ትርጓሜዎች ከፈጠሩ በኋላ የእርስዎ የተግባር ትርጓሜዎች በውስጣቸው ኮድ ከሌላቸው በስተቀር የእርስዎ ሲፒፒ ፎቶ 6.2 ን መምሰል አለበት።

አሁን በፎቶ 6.2 ውስጥ ያለውን ተመሳሳይ ኮድ ወደ የተግባር ትርጓሜዎችዎ ማከል ይፈልጋሉ። ቀደም ሲል እንደተገለፀው ፣ የህዝብ ተግባሮቻችን ptrInstance የሚያመለክተውን የሚመልሰውን የ Instance () ተግባርን ይጠቀማሉ። ይህ የክፍላችንን የግል ተግባራት እንድናገኝ ያስችለናል። በማንኛውም ነጠላተን የህዝብ ተግባር ፣ ያንን ቅጽበት ተግባር ብቻ መደወል አለብዎት። ለዚህ ብቸኛ የሆነው የእኛ የማቋረጥ ተግባር ነው።

ማሳሰቢያ -በዚህ ደረጃ የሚታየው ትክክለኛ የህዝብ እና የግል ተግባራት አስፈላጊ አይደሉም ፣ በግላዊ ተግባሩ ውስጥ የተለያዩ የተግባር ስሞች እና ክዋኔዎች ሊኖሩዎት ይችላሉ ፣ ግን ለማንኛውም የህዝብ ተግባር ፣ ከእሱ ጋር አብሮ ለመሄድ የግል ተግባር ሊኖርዎት ይገባል እና የህዝብ ተግባሩ ሁል ጊዜ በእኛ ሁኔታ (Instance) ተግባርን መጠቀም አለበት።

ደረጃ 7 - የተቋረጠውን ተግባር መፍጠር

የተቋረጠውን ተግባር መፍጠር
የተቋረጠውን ተግባር መፍጠር
የተቋረጠውን ተግባር መፍጠር
የተቋረጠውን ተግባር መፍጠር

በክፍላችን ውስጥ ነጠላችንን ከማህደረ ትውስታ ብቻ ማዛወር ስለምንችል ፣ የማይንቀሳቀስ የህዝብ ተግባር መፍጠር አለብን። ይህ ተግባር ክፍልን አጥፊ ብሎ በሚጠራው ptrInstance ላይ መሰረዝን ይጠራል እና ከዚያ የእርስዎ ፕሮግራም ካላበቃ እንደገና እንዲመደብ ptrInstance ን ወደ nullptr መመለስ እንፈልጋለን። በማንኛውም የ Singleton የግል ተለዋዋጮች ውስጥ የሰጡትን ማንኛውንም የተመደበ ማህደረ ትውስታ ለማፅዳት የእርስዎን Singletons ማቋረጥ ይፈልጋሉ።

ደረጃ 8 - PtrInstance ን ወደ Nullptr ማቀናበር

PtrInstance ን ወደ Nullptr ማቀናበር
PtrInstance ን ወደ Nullptr ማቀናበር

ነጠላዎን ለማጠናቀቅ ወደ EngineDebugSingleton. CPP ፋይል መሄድ እና በ CPP ፋይል አናት ላይ በእኛ ምሳሌ “EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr” ብለው ይተይቡ።

ይህንን ማድረግ መጀመሪያ ptrInstance ን ወደ nullptr ያዋቅራል ፣ ስለዚህ በመጀመሪያ በምሳሌነት ተግባር ውስጥ ለመጀመሪያ ጊዜ ሲያልፉ የእኛ ክፍል ለማስታወስ እንዲመደብ ይፈቀድለታል። ያለ እሱ ፣ ምንም ያልተመደበለትን ማህደረ ትውስታ ለመድረስ ስለሚሞክሩ ምናልባት ስህተት ይገጥሙዎታል።

ደረጃ 9 ሙከራ እና መደምደሚያ

ሙከራ እና መደምደሚያ
ሙከራ እና መደምደሚያ

አሁን የእኛ ነጠላ ሥራ መሥራቱን ለማረጋገጥ መሞከር እንፈልጋለን ፣ ይህ በደረጃ 6 ላይ እንደተገለፀው ያሉ የህዝብ ተግባሮችን በመጥራት እኛን ያካትታል እና እኛ በኮድዎ ውስጥ ለመግባት እና ነጠላውን እንደ የሚሰራ መሆኑን እንዲያዩ እንመክራለን። መሆን አለበት. የመነሻ ነጥባችን በፕሮጀክታችን main.cpp ውስጥ ይሆናል እና የእኛ ዋና.cpp አሁን ከዚህ በታች ያለውን ምስል ይመስላል።

እንኳን ደስ አላችሁ! የ Singleton Design Pattern ን የመጀመሪያ ትግበራዎን አሁን አጠናቀዋል። በዚህ የንድፍ ንድፍ ፣ አሁን ኮድዎን በተለያዩ መንገዶች ማመቻቸት ይችላሉ። ለምሳሌ ፣ አሁን ክፍልዎን ባካተቱበት በማንኛውም ቦታ በስታቲክ ተግባራት በኩል ሊደረስባቸው በሚችሉት በፕሮግራምዎ ሩጫ ጊዜ ውስጥ የሚሠሩ የአስተዳዳሪ ስርዓቶችን ማድረግ ይችላሉ።

የመጨረሻው የራስጌ ፋይልዎ ፎቶውን መምሰል አለበት 7.1. የእርስዎ ነጠላቶን ተዛማጅ የሲፒፒ ፋይል በደረጃ 8 ላይ የተመለከተውን ኮድ በፋይሉ አናት ላይ ፣ ፎቶ 6.2 ን መምሰል አለበት።

የመላ ፍለጋ ምክር;

ከማህደረ ትውስታ ጋር የተዛመዱ ስህተቶችን እያገኙ ነው?

PtrInstance ን ወደ nullptr ማቀናበርዎን ለማረጋገጥ ወደ ደረጃ 7 እና ደረጃ 8 ማመልከትዎን ያረጋግጡ።

ማለቂያ የሌለው ዑደት እየተከሰተ ነው?

ለሕዝባዊ ተግባራት እርግጠኛ ይሁኑ ፣ በእነሱ ትርጓሜዎች ውስጥ ፣ እርስዎ የግል ተግባሩን እየጠሩ ነው ፣ ተመሳሳይ የህዝብ ተግባር አይደለም።

የማስታወሻ ፍሰትን የሚያስከትሉ በነጠላ ድምጽ ውስጥ የተመደቡ ዕቃዎች?

በፕሮግራም ኮድዎ ውስጥ ተገቢ በሚሆንበት ጊዜ የነጠላቶንዎን የማቋረጫ ተግባር መደወልዎን ያረጋግጡ ፣ እና በነጠላቶንዎ አጥፊ ውስጥ ፣ በነጠላቶን ኮድ ወሰን ውስጥ ለማስታወስ የተመደቡ ማናቸውንም ነገሮች ማከፋፈሉን ያረጋግጡ።