সি ++ এ একটি হ্যান্ডেল কী?


99

আমাকে বলা হয়েছে যে একটি হ্যান্ডেলটি একটি পয়েন্টার বাছাই করা, তবে তা নয় এবং এটি আপনাকে অবজেক্টের পরিবর্তে কোনও বস্তুর রেফারেন্স রাখতে দেয়। এর আরও বিস্তৃত ব্যাখ্যা কী?



4
চেইন অফ রেসপন্সিবিলিটি প্যাটার্নটি দেখুন, আপনি শিখবেন যে একটি "হ্যান্ডেল" মূলত একটি নোড এবং "হ্যান্ডলার" সেগুলির একটি ছোট সেট। "যাদু" পুনরাবৃত্তি থেকে আসে

উত্তর:


101

একটি হ্যান্ডেল কোনও পূর্ণসংখ্য সূচক থেকে কার্নেল স্পেসের রিসোর্সে পয়েন্টার পর্যন্ত কিছু হতে পারে। ধারণাটি হ'ল তারা কোনও উত্সের বিমূর্ততা সরবরাহ করে, তাই এটি ব্যবহার করার জন্য আপনাকে উত্স সম্পর্কে নিজেই বেশি কিছু জানতে হবে না।

উদাহরণস্বরূপ, উইন 32 এপিআইএইচডাব্লুএনডি একটি উইন্ডোর হ্যান্ডেল। নিজেই এটি অকেজো: আপনি এ থেকে কোনও তথ্য সংগ্রহ করতে পারবেন না। তবে এটি ডান এপিআই কার্যক্রমে প্রেরণ করুন এবং আপনি এটির সাহায্যে বিভিন্ন কৌশল ব্যবহার করতে পারেন। অভ্যন্তরীণভাবে আপনি এইচডাব্লুএনডিটিকে জিইউআই এর উইন্ডোজের টেবিলের মধ্যে কেবল একটি সূচক হিসাবে ভাবতে পারেন (এটি সম্ভবত কীভাবে এটি বাস্তবায়িত হবে তা নয়, তবে এটি যাদুটিকে অর্থবোধ করে তোলে)।

সম্পাদনা: আপনি আপনার প্রশ্নে বিশেষত কী জিজ্ঞাসা করছেন তা 100% নির্দিষ্ট নয়। এটি মূলত খাঁটি সি / সি ++ এর কথা বলছে।


14
একটি হ্যান্ডেল (অন্যদের মধ্যে) রাজ্যের সংরক্ষণের জন্য কার্যকর হতে পারে। আপনার স্টাডি :: ভেক্টরের মতো কাঠামোতে ডেটা থাকলে। কোনও প্রোগ্রাম কার্যকর করার সময় আপনার অবজেক্ট বিভিন্ন সময়ে বিভিন্ন মেমরির অবস্থানগুলিতে থাকতে পারে যার অর্থ সেই মেমরির দিকে আপনার পয়েন্টারটির মান পরিবর্তন হবে। একটি হ্যান্ডেল দিয়ে এটি কখনই পরিবর্তন হয় না, এটি সর্বদা আপনার বস্তুর উল্লেখ করে। কোনও প্রোগ্রামের অবস্থা (কোনও গেমের মতো) সংরক্ষণের কল্পনা করুন - আপনি কোনও পয়েন্টারের অবস্থানটি ডেটাতে সংরক্ষণ করতে পারবেন না এবং পরে আবার ডেটা আমদানি করবেন না এবং সেই ঠিকানাটি মেমোরিতে পাওয়ার চেষ্টা করবেন না। তবে আপনি আপনার ডেটা সহ একটি হ্যান্ডেল সংরক্ষণ করতে পারেন এবং ডেটা এবং হ্যান্ডেল আমদানি করতে পারেন।
সিনিস্টাররেনবো

লিনাক্সে কোনও হ্যান্ডেলকে সমতুল্যে রূপান্তর করা কি সম্ভব? আমাকে এমন একটি প্রোগ্রাম স্থানান্তর করতে হবে যা উইন্ডোজ থেকে লিনাক্সে হ্যান্ডেল ব্যবহার করে।
কর্নেল ভার্সটার

4
এটি সঠিক উত্তর, তারা যে কোনও কিছু হতে পারে এবং যে কোডগুলি তাদের ব্যবহার করে তা হ্যান্ডেলের ধরণটি সংজ্ঞায়িত করে। আমি আমার নিজের অনুরূপ উত্তরের আরও সংক্ষিপ্ত সংস্করণ তৈরি করার চেষ্টা করেছি, উত্তরোত্তর জন্য নিজেকে সাহায্য করতে পারিনি। @ কর্নেলওয়ারস্টার - লিনাক্সে এগুলি একই রকম। মানে, ওএস হ্যান্ডেলগুলি নয়, ধারণাটি। সুতরাং, এটি তার স্থানান্তর হিসাবে হ্যান্ডেলটির উপর নির্ভর করে, বা এমনকি মাইগ্রেশন করা দরকার।
dyasta


51

একটি হ্যান্ডেল একটি পয়েন্টার বা সূচক যা এর সাথে দৃশ্যমান প্রকারের সাথে সংযুক্ত নেই। সাধারণত আপনি কিছু দেখতে পাবেন:

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

29

একটি হ্যান্ডেল হল এক ধরণের পয়েন্টার যা এটি সাধারণত কোনও সত্তাকে উল্লেখ করার একটি উপায়।

এটি বলা আরও সঠিক হবে যে পয়েন্টার হ্যান্ডেলগুলির এক প্রকারের, তবে সমস্ত হ্যান্ডলগুলি পয়েন্টার নয়।

উদাহরণস্বরূপ, একটি হ্যান্ডেল কোনও মেমরি টেবিলের মধ্যে কিছু সূচক হতে পারে, যা কোনও এন্ট্রির সাথে মিলিত হয় যা নিজেই কোনও বস্তুর পয়েন্টার ধারণ করে।

মূল কথাটি হ'ল যখন আপনার "হ্যান্ডেল" থাকে, আপনি জানেন না বা যত্নও করেননি যে সেই হ্যান্ডেলটি যে জিনিসটি সনাক্ত করে তা কীভাবে চিহ্নিত করা যায়, আপনার যা যা জানা দরকার তা হ'ল এটি does

এটিও স্পষ্ট হওয়া উচিত যে "হ্যান্ডেলটি আসলে কী" এর কোনও একক উত্তর নেই, কারণ একই জিনিসগুলিতে এমনকি বিভিন্ন জিনিসকে হ্যান্ডলগুলি "হুডের নীচে" বিভিন্নভাবে প্রয়োগ করা যেতে পারে। তবে আপনার এই পার্থক্যগুলির সাথে উদ্বিগ্ন হওয়ার দরকার নেই।


6

সি ++ / সিএলআই-তে, একটি হ্যান্ডেল হ'ল জিসি হিপে অবস্থিত কোনও বস্তুর পয়েন্টার। (পরিচালনা না করা) সি ++ হিপ ব্যবহার করে অর্জিত হয় newএবং একটি newএক্সপ্রেশনের ফলাফলটি একটি "সাধারণ" পয়েন্টার। একটি পরিচালিত অবজেক্টটি gcnewএক্সপ্রেশন সহ জিসি (পরিচালিত) হিপগুলিতে বরাদ্দ করা হয় । ফলাফল হ্যান্ডেল হবে। আপনি হ্যান্ডলগুলিতে পয়েন্টার পাটিগণিত করতে পারবেন না। আপনি হ্যান্ডলগুলি মুক্ত করেন না। জিসি তাদের যত্ন নেবে। এছাড়াও, জিসি পরিচালিত হিপগুলিতে অবজেক্টগুলি স্থানান্তর করতে এবং প্রোগ্রামটি চলাকালীন নতুন অবস্থানগুলিতে নির্দেশ করার জন্য হ্যান্ডেলগুলি আপডেট করতে মুক্ত।


5

এটি হ্যান্ডেল-বডি- ইডিয়ামের প্রসঙ্গে উপস্থিত হয় , তাকে পিম্পল আইডিয়মও বলা হয়। এটি অন্য একটি শ্রেণীর অবজেক্টে প্রকৃত তথ্য রাখার মাধ্যমে একটি লাইব্রেরির এবিআই (বাইনারি ইন্টারফেস) একই রাখার অনুমতি দেয়, যা কেবল "হ্যান্ডেল" অবজেক্টে রাখা পয়েন্টার দ্বারা রেফারেন্স করা হয়, সেই শ্রেণীর প্রতিনিধিত্বকারী ফাংশনগুলির সমন্বয়ে " দেহ "।

এটি দুটি অবজেক্টের ধ্রুবক সময় এবং ব্যতিক্রম নিরাপদ অদলবদ সক্ষম করতেও কার্যকর। এর জন্য, কেবলমাত্র শরীরের বস্তুটির দিকে নির্দেশকারী পয়েন্টারটি অদলবদল করতে হবে।


2

একটি হ্যান্ডেল যা হ'ল তা হ'ল।

একটি হ্যান্ডেল কিছু সন্ধানের সারণীতে ব্যবহৃত স্বাক্ষরবিহীন পূর্ণসংখ্যা হতে পারে।

একটি হ্যান্ডেল ডেটার একটি বৃহত্তর সেট বা একটি মধ্যে পয়েন্টার হতে পারে।

এটি হ্যান্ডেলটি ব্যবহার করে এমন কোডটি কীভাবে আচরণ করে তার উপর নির্ভর করে। এটি হ্যান্ডেলের ধরণ নির্ধারণ করে।

' হ্যান্ডেল ' শব্দটি ব্যবহৃত হওয়ার কারণটি গুরুত্বপূর্ণ। এটি তাদের সনাক্তকরণ বা অ্যাক্সেসের ধরণের অবজেক্ট হিসাবে নির্দেশ করে। অর্থ, প্রোগ্রামারটির কাছে, তারা একটি 'কী' বা কিছুতে অ্যাক্সেসের প্রতিনিধিত্ব করে ।


2

HANDLE hnd; এটার মতই void * ptr;

হ্যান্ডেল ভিজ্যুয়াল স্টুডিওতে (উইন্ডোজ) উইন্ট হ্যান্ড ফাইলের মধ্যে সংজ্ঞাযুক্ত একটি টাইপডেফ:

typedef void *HANDLE;

হ্যান্ডেল সম্পর্কে আরও পড়ুন


4
এটি কেবল উইন্ডোজে প্রযোজ্য, এবং উইন্ডোজ আর্কিটেকচারের মাধ্যমে ব্যবহৃত হ্যান্ডলগুলির মধ্যে কেবল একটির। যাইহোক, যে হয় কি একটি 'স্বাভাবিক উইন্ডোজ অ্যাপ্লিকেশন-স্তর হ্যান্ডেল' নামে করা হবে।
ডায়াস্টা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.