سؤال

لقد قيل لي أن المقبض هو نوع من المؤشر، ولكن ليس، وأنه يسمح لك بالحفاظ على إشارة إلى كائن، بدلا من الكائن نفسه. ما هو شرح أكثر تفصيلا؟

هل كانت مفيدة؟

المحلول

يمكن أن يكون المقبض أي شيء من مؤشر عدد صحيح إلى مؤشر إلى مورد في مساحة Kernel. هذه الفكرة هي أنها توفر تجريد مورد، لذلك لا تحتاج إلى معرفة الكثير عن المورد نفسه لاستخدامه.

على سبيل المثال، فإن HWND في واجهة برمجة تطبيقات Win32 هي مقبض للنافذة. بحد ذاته لا طائل منه: لا يمكنك غياب أي معلومات منه. ولكن اجتيازها إلى وظائف API الصحيحة، ويمكنك إجراء ثروة من الحيل المختلفة معها. داخليا يمكنك التفكير في HWND باعتباره مجرد فهرس في جدول ويندوز واجهة المستخدم الرسومية (التي قد لا تكون بالضرورة كيف يتم تنفيذها، لكنها تجعل السحر معنى).

تحرير: ليس 100٪ معين ما الذي كنت تسأل على وجه التحديد في سؤالك. هذا يتحدث بشكل أساسي عن نقية C / C ++.

نصائح أخرى

مقبض هو مؤشر أو فهرس دون أي نوع مرئي متصل به. عادة ما ترى شيئا مثل:

 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);
     }
 }

مقبض يكون هناك نوع من المؤشر في أنه هو وسيلة للإشارة إلى بعض الكيان.

سيكون أكثر دقة أن نقول أن المؤشر هو نوع واحد من المقبض، ولكن ليس كل المقابض هي مؤشرات.

على سبيل المثال، قد يكون المقبض أيضا بعض الفهرس في جدول الذاكرة، والذي يتوافق مع إدخال يحتوي نفسه على مؤشر لبعض الكائنات.

الشيء الرئيسي هو أنه عندما يكون لديك "مقبض"، لا تعرف ولا تهتم بكيفية انتهاء هذا التعامل بالفعل تحديد الشيء الذي يحدده، كل ما تحتاج إلى معرفته هو أنه يفعل ذلك.

يجب أن يكون من الواضح أيضا أنه لا توجد إجابة واحدة على "ما هو بالضبط مقبض"، لأن المقابض مع أشياء مختلفة، حتى في نفس النظام، قد يتم تنفيذها بطرق مختلفة "تحت غطاء محرك السيارة". لكن يجب أن لا تحتاج إلى أن تهتم بتلك الاختلافات.

في C ++ / CLI، مقبض هو مؤشر إلى كائن موجود على كومة GC. يتم إنشاء كائن في كومة C ++ C ++ (غير المدارة) باستخدام new ونتيجة new التعبير هو مؤشر "طبيعي". يتم تخصيص كائن مدار على كومة GC (المدارة) مع gcnew التعبير. ستكون النتيجة مقبض. لا يمكنك القيام بمؤشر حسابي على مقابض. أنت لا تستخدم مقابض مجانية. سوف تعتني GC بهم. أيضا، فإن GC مجاني في نقل الكائنات الموجودة على الكومة المدارة وتحديث المقابض المراد الإشارة إلى المواقع الجديدة أثناء تشغيل البرنامج.

هذا يظهر في سياق التعامل مع الجسم, ، ودعا أيضا pimpl elibom. يسمح لأحد بإبقاء واجهة ABI (واجهة ثنائية) من مكتبة نفسها، من خلال الحفاظ على البيانات الفعلية في كائن فئة أخرى، والتي تتم الإشارة إليها فقط بمؤشر محتجز في كائن "مقبض"، يتكون من وظائف تفوض ذلك في هذا الفصل " الجسم".

من المفيد أيضا تمكين وقت ثابت واستثناء مبادلة آمنة من كائنين. لهذا، يجب أن يتم تبديل المؤشر الذي يشير إلى كائن الجسم.

مقبض هو ما تريد أن تكون.

يمكن أن يكون مقبض عددا صحيحا غير موقعة يستخدم في جدول البحث.

يمكن أن يكون المقبض مؤشرا أو في مجموعة أكبر من البيانات.

ذلك يعتمد على كيفية تصرف الكود الذي يستخدم المقبض. التي تحدد نوع المقبض.

السبب المصطلحمقبضيستخدم هو ما هو مهم. التي تشير إلىها كهديد أو نوع الوصول من الكائن. معنى للمبرمجين، يمثلون "مفتاح" أو الوصول إلى شيء ما.

HANDLE hnd; بالضبط مثل void * ptr;

التعامل مع TypeDef المعرفة في ملف Winnt.h في Visual Studio (Windows):

typedef void *HANDLE;

اقرأ المزيد مقبض

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top