मेरे पास यह मौजूदा कोड है जहां उनके पास एक क्लास है और उस क्लास में एक इनिशियलाइज़ेशन का तरीका है। यह उम्मीद की जाती है कि एक बार कक्षा का उद्देश्य बन जाने के बाद, उन्हें इस पर आरंभिक कॉल करने की आवश्यकता है।
प्रारंभिक विधि मौजूद क्यों है इसका कारण यह है कि ऑब्जेक्ट वैश्विक दायरे के लिए जल्दी तैयार हो जाता है और फिर प्रारंभिक विधि को एक डीएल को लोड करने के बाद कहा जाता है जिस पर यह निर्भर करता है।
इनिशियलाइज़ होने के साथ इश्यू अब क्लास में यह बूल है। इनऑर्गेनाइज्ड है जिसे आगे बढ़ने से पहले हर तरीके की जाँच करनी होगी और अगर यह इनिशियलाइज़ नहीं हुआ तो एरर देता है। सीधे शब्दों में कहें, तो यह एक बड़ी पीड़ा है।
एक संभव समाधान कंस्ट्रक्टर में प्रारंभ करें। वैश्विक दायरे में वस्तु के लिए सिर्फ एक संकेतक है। Dll लोड होने के बाद वास्तविक ऑब्जेक्ट बनाएँ।
उपरोक्त समाधान के साथ समस्या जो कोई भी इस वर्ग की वस्तु बनाता है उसे यह जानने की जरूरत है कि इसे केवल डीएल के लोड होने के बाद ही बनाया जाना चाहिए अन्यथा यह विफल हो जाएगा।
क्या यह स्वीकार्य है?
call_once
। जो प्रोजेक्ट्स अभी तक C ++ 11 पर नहीं हैं, उन्हें यह अध्ययन करना चाहिए कि C ++ 11 में call_once कैसे लागू किया जाता है (यह किस समस्या को हल करता है, और फिर कैसे) पर ध्यान दें, और फिर C ++ के उनके (बासी) स्वाद में इसे फिर से लागू करें। इसे एक बहु-थ्रेड सुरक्षित सिंक्रनाइज़ेशन आदिम की आवश्यकता होती है, जिसकी अवस्था को वैधानिक रूप से आरंभिक (स्थिर मान के साथ) करने की आवश्यकता होती है। ध्यान दें कि पूर्व-सी ++ 11 संकलक में अन्य idiosyncrasies हो सकते हैं जिन्हें संतुष्ट करने की आवश्यकता है।