c++ सी++ में एक हैंडल क्या है?




सी प्रोग्रामिंग इन हिंदी नोट्स pdf (6)

मुझे बताया गया है कि एक हैंडल एक सूचक का प्रकार है, लेकिन नहीं, और यह आपको ऑब्जेक्ट के बजाए किसी ऑब्जेक्ट का संदर्भ रखने की अनुमति देता है। एक और विस्तृत स्पष्टीकरण क्या है?


यह Handle-Body-Idiom के संदर्भ में दिखाई देता है, जिसे पिंपल मुहावरे भी कहा जाता है। यह किसी को एक पुस्तकालय के एबीआई (बाइनरी इंटरफ़ेस) को एक अन्य वर्ग ऑब्जेक्ट में रखकर, एक पुस्तकालय के एबीआई (बाइनरी इंटरफ़ेस) को रखने की अनुमति देता है, जिसे केवल "हैंडल" ऑब्जेक्ट में रखे गए पॉइंटर द्वारा संदर्भित किया जाता है, जिसमें उस वर्ग को प्रस्तुत करने वाले फ़ंक्शंस शामिल होते हैं " तन"।

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


एक हैंडल एक पूर्णांक सूचकांक से किसी सूचक को कर्नेल स्पेस में संसाधन के लिए कुछ भी हो सकता है। विचार यह है कि वे संसाधन का एक अमूर्त प्रदान करते हैं, इसलिए संसाधन का उपयोग करने के लिए आपको संसाधन के बारे में ज्यादा जानकारी नहीं है।

उदाहरण के लिए, Win32 API में HWND विंडो के लिए एक हैंडल है। अपने आप से यह बेकार है: आप इससे कोई जानकारी नहीं प्राप्त कर सकते हैं। लेकिन इसे सही एपीआई कार्यों में पास करें, और आप इसके साथ विभिन्न चालों का धन कर सकते हैं। आंतरिक रूप से आप एचडब्ल्यूएनडी के बारे में सोच सकते हैं कि जीयूआई की खिड़कियों की तालिका में केवल एक इंडेक्स है (जो जरूरी नहीं है कि यह कैसे कार्यान्वित किया जाए, लेकिन यह जादू को समझ में आता है)।

संपादित करें: 100% निश्चित नहीं है कि आप विशेष रूप से अपने प्रश्न में क्या पूछ रहे थे। यह मुख्य रूप से शुद्ध सी / सी ++ के बारे में बात कर रहा है।


एक हैंडल एक सूचक या सूचकांक है जिसमें इसके साथ जुड़े कोई दृश्य प्रकार नहीं है। आमतौर पर आप कुछ ऐसा देखते हैं:

 typedef void* HANDLE;
 HANDLE myHandleToSomething = CreateSomething();

तो अपने कोड में आप केवल एक अपारदर्शी मूल्य के रूप में हैंडल पास करते हैं।

ऑब्जेक्ट का उपयोग करने वाले कोड में, यह पॉइंटर को वास्तविक संरचना प्रकार में रखता है और इसका उपयोग करता है:

 int doSomething(HANDLE s, int a, int b) {
     Something* something = reinterpret_cast<Something*>(s);
     return something->doit(a, b);
 }

या यह इसे एक सरणी / वेक्टर के लिए एक सूचकांक के रूप में उपयोग करता है:

 int doSomething(HANDLE s, int a, int b) {
     int index = (int)s;
     try {
         Something& something = vecSomething[index];
         return something.doit(a, b);
     } catch (boundscheck& e) {
         throw SomethingException(INVALID_HANDLE);
     }
 }

HANDLE hnd; is same as void * ptr;

हैंडल विज़ुअल स्टूडियो (विंडोज़) में winnt.h फ़ाइल में परिभाषित एक टाइपफ़ेड है।

आईसी: typedef void *HANDLE;

HANDLE बारे में और पढ़ें


एक हैंडल एक प्रकार का सूचक है जिसमें यह आमतौर पर कुछ इकाई का संदर्भ देने का एक तरीका है।

यह कहना अधिक सटीक होगा कि एक सूचक एक प्रकार का हैंडल है, लेकिन सभी हैंडल पॉइंटर्स नहीं हैं।

उदाहरण के लिए, एक हैंडल मेमोरी टेबल में कुछ इंडेक्स भी हो सकता है, जो उस प्रविष्टि से मेल खाता है जिसमें कुछ ऑब्जेक्ट में पॉइंटर होता है।

मुख्य बात यह है कि जब आपके पास "हैंडल" होता है, तो आप न तो जानते हैं और न ही इस बात की परवाह करते हैं कि यह संभाल वास्तव में उस चीज़ की पहचान करने के लिए कैसे समाप्त होती है, जिसे आप पहचानते हैं, आपको यह जानने की ज़रूरत है कि यह करता है।

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


सी ++ / सीएलआई में, एक हैंडल जीसी ढेर पर स्थित किसी ऑब्जेक्ट के लिए एक सूचक है। (अप्रबंधित) सी ++ ढेर पर एक ऑब्जेक्ट बनाना new उपयोग करके हासिल किया जाता है और एक new अभिव्यक्ति का परिणाम एक "सामान्य" सूचक होता है। gcnew अभिव्यक्ति के साथ जीसी (प्रबंधित) ढेर पर एक प्रबंधित ऑब्जेक्ट आवंटित किया जाता है। नतीजा एक संभाल होगा। आप हैंडल पर पॉइंटर अंकगणित नहीं कर सकते हैं। आप हैंडल मुक्त नहीं करते हैं। जीसी उनका ख्याल रखेगा। साथ ही, जीसी प्रबंधित ढेर पर ऑब्जेक्ट्स को स्थानांतरित करने के लिए स्वतंत्र है और प्रोग्राम चल रहा है, जबकि नए स्थानों को इंगित करने के लिए हैंडल अपडेट करें।





handle