विषयसूची:

C++ में सिंगलटन डिज़ाइन पैटर्न कैसे करें: 9 कदम
C++ में सिंगलटन डिज़ाइन पैटर्न कैसे करें: 9 कदम

वीडियो: C++ में सिंगलटन डिज़ाइन पैटर्न कैसे करें: 9 कदम

वीडियो: C++ में सिंगलटन डिज़ाइन पैटर्न कैसे करें: 9 कदम
वीडियो: Singleton Design Pattern | Object Oriented Programming | OOP | Design Patterns | C++ | Rana Waqas 2024, जून
Anonim
C++ में सिंगलटन डिज़ाइन पैटर्न कैसे करें?
C++ में सिंगलटन डिज़ाइन पैटर्न कैसे करें?

परिचय:

इस निर्देश मार्गदर्शिका का उद्देश्य उपयोगकर्ता को अपने सी ++ प्रोग्राम में सिंगलटन डिज़ाइन पैटर्न को कार्यान्वित करने के तरीके के बारे में सिखाना है। ऐसा करने पर, यह निर्देश सेट पाठक को यह भी समझाएगा कि सिंगलटन के तत्व वैसे ही क्यों हैं और कोड कैसे संसाधित किया जाता है। यह जानने से, भविष्य में आपके भविष्य के सिंगलेट्स को डीबग करने में मदद मिलेगी। सिंगलटन डिजाइन पैटर्न क्या है? सिंगलटन डिज़ाइन पैटर्न एक डिज़ाइन पैटर्न है जहां कोडर एक वर्ग बनाता है जिसे केवल एक बार तत्काल किया जा सकता है, कक्षाओं के सार्वजनिक कार्यों को मूल रूप से कहीं भी एक्सेस किया जा सकता है, बशर्ते आपने अन्य प्रोजेक्ट से संबंधित फाइलों में हेडर फ़ाइल शामिल की हो।

सिंगलटन डिज़ाइन पैटर्न किसी भी ऑब्जेक्ट-ओरिएंटेड प्रोग्रामर, सॉफ़्टवेयर प्रोग्रामर और गेम प्रोग्रामर के लिए डिज़ाइन पैटर्न जानना आवश्यक है। सिंगलटन डिज़ाइन पैटर्न भी सबसे आसान कोडिंग डिज़ाइन पैटर्न में से एक है। इसे सीखना आपको भविष्य में अन्य, अधिक कठिन, डिज़ाइन पैटर्न सीखने में मदद कर सकता है। यह आपके प्रोग्राम के कोड को उन तरीकों से सुव्यवस्थित करने में भी आपकी मदद कर सकता है जो आपको नहीं लगता था कि संभव था।

जबकि अन्य डिज़ाइन पैटर्न की तुलना में सिंगलटन डिज़ाइन पैटर्न की कठिनाई आसान है, इस निर्देश सेट में मध्यम कठिनाई है। इसका मतलब है कि इन निर्देशों को करने के लिए, हम अनुशंसा करते हैं कि आप C++ की बुनियादी और अग्रिम सिंटैक्स आवश्यकताओं को जानते हैं। आपको उचित सी ++ कोडिंग शिष्टाचार भी पता होना चाहिए (यानी कक्षा चर निजी रखें, एक वर्ग प्रति शीर्षलेख फ़ाइल इत्यादि)। आपको यह भी पता होना चाहिए कि मेमोरी को कैसे मुक्त किया जाए और C++ में कंस्ट्रक्टर और डिस्ट्रक्टर कैसे काम करते हैं।

इस निर्देशात्मक मार्गदर्शिका में औसतन लगभग 10-15 मिनट का समय लगेगा।

सामग्री आवश्यकताएँ:

-एक कंप्यूटर (पीसी या मैक हो सकता है) विजुअल स्टूडियो (कोई भी संस्करण) चलाने में सक्षम

-विजुअल स्टूडियो में बनाया गया एक साधारण प्रोग्राम, जिससे आप अपने सिंगलटन का परीक्षण कर सकते हैं

नोट: सिंगलटन डिज़ाइन पैटर्न किसी अन्य C++ सपोर्टिंग IDE या कोडिंग इंटरफ़ेस पर किया जा सकता है, लेकिन इस निर्देश सेट के लिए, हम Visual Studios Enterprise Edition का उपयोग करेंगे।

चरण 1: हैडर फ़ाइल और CPP फ़ाइल के साथ अपनी कक्षा बनाएँ

हेडर फाइल और सीपीपी फाइल के साथ अपनी कक्षा बनाएं
हेडर फाइल और सीपीपी फाइल के साथ अपनी कक्षा बनाएं
हेडर फाइल और सीपीपी फाइल के साथ अपनी कक्षा बनाएं
हेडर फाइल और सीपीपी फाइल के साथ अपनी कक्षा बनाएं

इन दोनों फाइलों और कक्षा को एक साथ बनाने के लिए, विजुअल स्टूडियो में अपना प्रोजेक्ट/प्रोग्राम खोलें, समाधान एक्सप्लोरर पर जाएं, राइट क्लिक करें, और आपके माउस कर्सर के पास एक बॉक्स दिखाना चाहिए, "जोड़ें" विकल्प ढूंढें, होवर करें इसके ऊपर, और एक अन्य बॉक्स दाईं ओर दिखाई देना चाहिए। इस बॉक्स में, आप "नया आइटम.." विकल्प ढूंढना चाहते हैं, इसे क्लिक करें और नीचे दी गई तस्वीर 1.1 छवि जैसी एक विंडो दिखाई देनी चाहिए। इस विंडो में आप "सी ++ क्लास" का चयन करना चाहते हैं और फिर "जोड़ें" दबाएं। यह एक और विंडो खोलेगा जो फोटो 1.2 इमेज से मिलती जुलती है। इस विंडो में, आप "कक्षा का नाम" फ़ील्ड में अपनी कक्षा का नाम टाइप करते हैं और विजुअल स्टूडियो स्वचालित रूप से कक्षा के नाम के बाद वास्तविक फ़ाइल का नाम देगा। इस निर्देश के उद्देश्य के लिए, हम अपनी कक्षा का नाम "EngineDebugSingleton" रखने जा रहे हैं, लेकिन यह कोई भी अक्षर-आधारित नाम हो सकता है। अब आप "ओके" को हिट कर सकते हैं और चरण 2 पर आगे बढ़ सकते हैं।

नोट: समाधान एक्सप्लोरर और जहां फाइलें आपके कंप्यूटर पर रखी जाती हैं, वे अलग-अलग हैं। समाधान एक्सप्लोरर में कुछ भी ले जाना या बनाना आपके ओएस फाइल एक्सप्लोरर के भीतर फाइलों को स्थानांतरित या व्यवस्थित नहीं करेगा। फ़ाइल एक्सप्लोरर पक्ष पर अपनी फ़ाइलों को व्यवस्थित करने का एक सुरक्षित तरीका हटा दिया जाएगा, लेकिन समाधान एक्सप्लोरर से विशिष्ट फ़ाइलों को हटा नहीं दिया जाएगा, वही फ़ाइलों को फ़ाइल एक्सप्लोरर में वांछित स्थान पर ले जाएं और फिर समाधान एक्सप्लोरर पर वापस जाएं, राइट क्लिक करें, विकल्प "जोड़ें" ढूंढें, फिर "मौजूदा आइटम" ढूंढें और उन फ़ाइलों को ढूंढें जिन्हें आपने स्थानांतरित किया था। सुनिश्चित करें कि आप हेडर और सीपीपी फ़ाइल दोनों को स्थानांतरित करते हैं।

चरण 2: कंस्ट्रक्टर को निजी पर सेट करें

कंस्ट्रक्टर को निजी पर सेट करें
कंस्ट्रक्टर को निजी पर सेट करें

आपकी नई बनाई गई सीपीपी फ़ाइल और हेडर फ़ाइल के साथ, यदि इसे बनाते समय यह स्वचालित रूप से नहीं खुलती है, तो समाधान एक्सप्लोरर पर जाएं और "EngineDebugSingleton.h" पर क्लिक करें और खोलें। फिर आपको "इंजनडिबगसिंगलटन ()", क्लास डिफॉल्ट कंस्ट्रक्टर और "~ इंजनडेबगसिंगलटन ()" क्लास डिस्ट्रक्टर के साथ बधाई दी जाएगी। इस स्टेप के लिए, हम कंस्ट्रक्टर को प्राइवेट में सेट करना चाहेंगे, इसका मतलब है कि यह फंक्शन केवल क्लास के लिए उपलब्ध है और कुछ नहीं। इसके साथ, आप केवल कक्षाओं की हेडर फ़ाइल और कक्षाओं के अन्य कार्यों में, कक्षा के बाहर एक चर बनाने या कक्षा को स्मृति में आवंटित करने में सक्षम नहीं होंगे। कंस्ट्रक्टर का निजी होना डिज़ाइन पैटर्न की कुंजी है और सिंगलटन कैसे काम करते हैं। हम भविष्य के चरणों में पता लगाएंगे कि कैसे एक सिंगलटन को तत्काल और एक्सेस किया जाता है।

कंस्ट्रक्टर को प्राइवेट में ले जाने के बाद क्लास अब इस तरह दिखनी चाहिए (संबंधित फोटो देखें)

चरण 3: विनाशक को निजी पर सेट करें

विनाशक को निजी पर सेट करें
विनाशक को निजी पर सेट करें

जैसा हमने कंस्ट्रक्टर के साथ किया था

चरण 2, इस चरण के लिए, अब हम विध्वंसक को निजी पर सेट करेंगे। कंस्ट्रक्टर की तरह, क्लास को छोड़कर कुछ भी नहीं, मेमोरी से क्लास के किसी भी वेरिएबल को डिलीट करने में सक्षम होगा।

इस स्टेप को पूरा करने के बाद अब क्लास इस तरह दिखनी चाहिए। (एसोसिएटेड फोटो देखें)

चरण 4: सिंगलटन में एक स्थिर सूचक चर बनाना

सिंगलटन में एक स्टेटिक पॉइंटर वैरिएबल बनाना
सिंगलटन में एक स्टेटिक पॉइंटर वैरिएबल बनाना

इस चरण में, हम a. बनाएंगे

"EngineDebugSingleton*" प्रकार का स्थिर सूचक चर। यह वेरिएबल होगा जिसका उपयोग हमारे सिंगलटन को मेमोरी में आवंटित करने के लिए किया जाएगा और यह उस पूरे समय के लिए इंगित करेगा जब हमारे सिंगलटन को मेमोरी में आवंटित किया जाता है।

इस वेरिएबल को बनाने के बाद हमारी हेडर फाइल इस तरह दिखनी चाहिए

चरण 5: एक इंस्टेंस फ़ंक्शन बनाना

एक इंस्टेंस फंक्शन बनाना
एक इंस्टेंस फंक्शन बनाना

अब हम एक उदाहरण बनाना चाहते हैं

समारोह। फ़ंक्शन को एक स्थिर फ़ंक्शन होने की आवश्यकता होगी और वह हमारी कक्षा ("EngineDebugSingleton&") के लिए एक संदर्भ वापस करना चाहेगा। हमने अपने फ़ंक्शन को इंस्टेंस() कहा। फ़ंक्शन में ही, हम पहले परीक्षण करना चाहेंगे कि क्या ptrInstance == nullptr (छोटा जा सकता है !ptrInstance), यदि यह nullptr है, तो इसका मतलब है कि सिंगलटन को आवंटित नहीं किया गया है और if स्टेटमेंट के दायरे में, हम करेंगे ptrInstance = new EngineDebugSingleton() करके आवंटित करना चाहते हैं। यह वह जगह है जहां आप वास्तव में सिंगलटन को स्मृति में आवंटित करते हैं। इफ स्टेटमेंट के दायरे से बाहर निकलने के बाद, हम फिर उस ptrInstance को वापस कर देंगे, जो कि सिंटैक्स "*ptrInstance" द्वारा दर्शाया गया है। हम अपने स्थिर सार्वजनिक कार्यों को बनाते समय इस फ़ंक्शन का भारी उपयोग करेंगे, इसलिए हम यह देखने के लिए जांच कर सकते हैं कि क्या सिंगलटन बनाया गया है और स्मृति को आवंटित किया गया है। संक्षेप में, यह फ़ंक्शन इसे बनाता है ताकि आपके पास कक्षा का केवल एक आवंटन हो और अधिक नहीं।

इंस्टेंस () फ़ंक्शन बनाने के बाद अब हमारी कक्षा इस तरह दिखनी चाहिए। जैसा कि आप देख सकते हैं, हमने जो कुछ भी किया है वह कक्षा के निजी अनुभाग में रहा है, यह अगले कुछ चरणों में थोड़ा बदलने वाला है।

चरण 6: स्थैतिक सार्वजनिक कार्य बनाना

स्थैतिक सार्वजनिक कार्यों का निर्माण
स्थैतिक सार्वजनिक कार्यों का निर्माण
स्थैतिक सार्वजनिक कार्यों का निर्माण
स्थैतिक सार्वजनिक कार्यों का निर्माण
स्थैतिक सार्वजनिक कार्यों का निर्माण
स्थैतिक सार्वजनिक कार्यों का निर्माण

आपके द्वारा फंक्शन बनाने के बाद

चरण 5, आप स्थैतिक सार्वजनिक कार्य करना शुरू कर सकते हैं। प्रत्येक सार्वजनिक समारोह के साथ जाने के लिए एक निजी समारोह होना चाहिए, इस समारोह का नाम एक जैसा नहीं हो सकता। फ़ंक्शन को स्थिर क्यों बनाएं? हम सार्वजनिक कार्यों को स्थिर बना रहे हैं ताकि उन्हें वास्तविक वस्तु के बिना एक्सेस किया जा सके। इसलिए "EngineDebugSingleObj->SomeFunction ()" जैसा कुछ करने के बजाय, हम "EngineDebugSingleton:: Some Function()" करते हैं। यह एक सिंगलटन के लिए मूल रूप से कोड में कहीं भी एक्सेस करना संभव बनाता है, बशर्ते आपने उस विशिष्ट प्रोजेक्ट फ़ाइल में हेडर फ़ाइल #included की है जिसके साथ आप काम कर रहे हैं। इससे आप इसके किसी भी पब्लिक फंक्शन के जरिए सिंगलटन भी बना सकते हैं।

इस चरण में हमारे उद्देश्यों के लिए हमने दो सार्वजनिक स्थैतिक शून्य कार्य बनाए, "जोड़ें ()" और "घटाना ()"। निजी खंड में, हम दो और कार्य करते हैं, "PrivAdd ()" और "PrivSubtract ()"। हमने "NumberOfThings" नामक एक इंट वैरिएबल भी जोड़ा है। इन कार्यों की परिभाषा हमारी कक्षाओं की CPP फ़ाइल में जाएगी। फ़ंक्शन को सीपीपी फ़ाइल में आसानी से लाने के लिए, आप अपने कर्सर के साथ, फ़ंक्शन को हाइलाइट करते हैं, जिसके नीचे एक हरी रेखा होनी चाहिए, और "बाएं ALT + ENTER" दबाएं, यह आपको विकल्प में परिभाषा बनाने का विकल्प देगा Classes' संबद्ध CPP फ़ाइल। यह देखने के लिए फोटो 6.1 देखें कि हेडर फाइल कैसी दिखनी चाहिए और आपके द्वारा सभी फ़ंक्शन परिभाषाएं बनाने के बाद, आपका सीपीपी फोटो 6.2 जैसा दिखना चाहिए, सिवाय इसके कि आपकी फ़ंक्शन परिभाषाओं में कोई कोड नहीं होगा।

अब आप उसी कोड को फोटो 6.2 में अपनी फ़ंक्शन परिभाषाओं में जोड़ना चाहेंगे। जैसा कि पहले कहा गया है, हमारे सार्वजनिक कार्य इंस्टेंस () फ़ंक्शन का उपयोग करेंगे, जो कि ptrInstance इंगित कर रहा है। यह हमें अपनी कक्षा के निजी कार्यों तक पहुँचने की अनुमति देता है। किसी सिंगलटन के सार्वजनिक समारोह के साथ, आपको केवल उस इंस्टेंस फ़ंक्शन को कॉल करना चाहिए। इसका एकमात्र अपवाद हमारा टर्मिनेट फंक्शन है।

नोट: इस चरण में दिखाए गए सटीक सार्वजनिक और निजी फ़ंक्शन आवश्यक नहीं हैं, आपके पास निजी फ़ंक्शन में अलग-अलग फ़ंक्शन नाम और संचालन हो सकते हैं, लेकिन किसी भी प्रकार के सार्वजनिक फ़ंक्शन के लिए, आपके पास इसके साथ जाने के लिए एक निजी फ़ंक्शन होना चाहिए और हमारे मामले में, सार्वजनिक फ़ंक्शन को हमेशा इंस्टेंस () फ़ंक्शन का उपयोग करना चाहिए।

चरण 7: टर्मिनेट फंक्शन बनाना

टर्मिनेट फंक्शन बनाना
टर्मिनेट फंक्शन बनाना
टर्मिनेट फंक्शन बनाना
टर्मिनेट फंक्शन बनाना

चूंकि हम अपनी कक्षा में केवल अपने सिंगलटन को स्मृति से हटा सकते हैं, इसलिए हमें एक स्थिर सार्वजनिक कार्य बनाना होगा। यह फ़ंक्शन ptrInstance पर डिलीट को कॉल करेगा, जो क्लास डिस्ट्रक्टर को कॉल करता है और फिर हम ptrInstance को वापस nullptr पर सेट करना चाहेंगे, ताकि आपका प्रोग्राम समाप्त न होने पर इसे फिर से आवंटित किया जा सके। आप किसी सिंगलटन के निजी चर में आवंटित किसी भी आवंटित स्मृति को साफ करने के लिए अपने सिंगलेट्स को भी समाप्त करना चाहेंगे।

चरण 8: PtrInstance को Nullptr. पर सेट करना

PtrInstance को Nullptr. पर सेट करना
PtrInstance को Nullptr. पर सेट करना

अपना सिंगलटन पूरा करने के लिए, आप EngineDebugSingleton. CPP फ़ाइल पर जाना चाहते हैं और CPP फ़ाइल के शीर्ष पर, हमारे उदाहरण में, “EngineDebugSingleton* EngineDebugSingleton::ptrInstance = nullptr” टाइप करें।

ऐसा करने से शुरू में ptrInstance को nullptr पर सेट कर दिया जाएगा, इसलिए जब आप पहली बार इंस्टेंस फंक्शन से पहली बार गुजरते हैं, तो हमारी क्लास को मेमोरी में आवंटित करने की अनुमति दी जाएगी। इसके बिना, सबसे अधिक संभावना है कि आपको एक त्रुटि मिलेगी क्योंकि आप उस स्मृति तक पहुँचने का प्रयास कर रहे होंगे जिसमें इसके लिए कुछ भी आवंटित नहीं किया गया है।

चरण 9: परीक्षण और निष्कर्ष

परीक्षण और निष्कर्ष
परीक्षण और निष्कर्ष

अब हम यह परीक्षण करना चाहेंगे कि हमारा सिंगलटन यह सुनिश्चित करने के लिए काम करता है, इसमें हमें चरण 6 में वर्णित सार्वजनिक कार्यों को कॉल करना शामिल होगा और हम अनुशंसा करते हैं कि आप अपने कोड के माध्यम से कदम उठाने के लिए ब्रेकपॉइंट सेट करें और देखें कि सिंगलटन काम कर रहा है यह होना चाहिए। हमारा प्रारंभिक बिंदु हमारे प्रोजेक्ट के main.cpp में होगा और हमारा main.cpp अब नीचे की छवि जैसा दिखता है।

बधाई हो! आपने सिंगलटन डिज़ाइन पैटर्न का अपना पहला कार्यान्वयन अभी-अभी पूरा किया है। इस डिज़ाइन पैटर्न के साथ, अब आप अपने कोड को विभिन्न तरीकों से सुव्यवस्थित कर सकते हैं। उदाहरण के लिए, अब आप प्रबंधक सिस्टम बना सकते हैं जो आपके प्रोग्राम के रन टाइम के दौरान काम करता है, जिसे स्थिर कार्यों के माध्यम से कहीं भी एक्सेस किया जा सकता है जहां आपने कक्षा को शामिल किया है।

आपकी अंतिम हेडर फाइल फोटो 7.1.1 जैसी दिखनी चाहिए। आपकी सिंगलटन की संबद्ध सीपीपी फ़ाइल चरण 8 में दिखाए गए कोड के साथ, फ़ाइल के शीर्ष पर, फोटो 6.2 की तरह दिखनी चाहिए। इस निर्देश ने आपको सिंगलटन डिज़ाइन पैटर्न की एक सरल संरचना प्रदान की है।

समस्या निवारण सलाह:

स्मृति संबंधी त्रुटियां प्राप्त करना?

सुनिश्चित करें कि आप ptrInstance को nullptr पर सेट कर रहे हैं, यह सुनिश्चित करने के लिए आप चरण 7 और चरण 8 का संदर्भ लें।

अनंत लूप हो रहा है?

सुनिश्चित करें कि सार्वजनिक कार्यों के लिए, उनकी परिभाषाओं में, आप निजी फ़ंक्शन को कॉल कर रहे हैं, समान सार्वजनिक फ़ंक्शन नहीं।

सिंगलटन के भीतर आवंटित वस्तुएं स्मृति रिसाव का कारण बनती हैं?

सुनिश्चित करें कि आप अपने प्रोग्राम कोड के भीतर उपयुक्त होने पर अपने सिंगलटन के टर्मिनेट फ़ंक्शन को कॉल करते हैं, और अपने सिंगलटन के विनाशक में, सुनिश्चित करें कि आपने सिंगलटन कोड के दायरे में स्मृति को आवंटित किसी भी ऑब्जेक्ट को डी-आवंटित किया है।