কেন সেখানে ইনজেকশন করা ক্লাসের নাম?


147

সম্প্রতি, আমি একটি অদ্ভুত সি ++ বৈশিষ্ট্য দেখেছি: ইনজেকশন শ্রেণীর নাম

class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...

তবে এই বৈশিষ্ট্যটি কেন প্রয়োজনীয় তা আমি বুঝতে পারি না। এমন কোন অনুশীলন রয়েছে যা এই বৈশিষ্ট্যটির প্রয়োজন?

এবং আমি শুনেছি এই বৈশিষ্ট্যটি পুরানো সি ++ তে বিদ্যমান ছিল না। তারপরে, কবে এটি চালু হয়েছিল? সি ++ 03? সি ++ 11?


বাডি, আপনি স্কাইপে দেখতে পারেন? আমি আপনার কাছে পৌঁছতে পারছি না
Irinel Iovan

উত্তর:


162

ইনজেকশন করা শ্রেণীর নামের অর্থ এটি Xএকটি সদস্য হিসাবে ঘোষিত হয় X, সুতরাং সেই নামের Xসন্ধানটি সর্বদা বর্তমান বর্গটি খুঁজে পায়, অন্য Xকোনওটি একই ঘেরের স্কোপ হিসাবে ঘোষিত হতে পারে না , যেমন

void X() { }
class X {
public:
  static X create() { return X(); }
};

হয় create()ফাংশন একটি অস্থায়ী তৈরি Xবস্তু বা ফাংশন কলিং X? নেমস্পেসের সুযোগে এটি ফাংশনটি কল করবে, সুতরাং ইনজেকশন করা-শ্রেণি-নামের উদ্দেশ্য হ'ল নামের বডির মধ্যে Xসর্বদা শ্রেণিটি খুঁজে পাওয়া যায় তা নিশ্চিত করা (কারণ নাম ঘেরের আগে অনুসন্ধানটি ক্লাসের নিজস্ব স্কোপে শুরু হয়) সুযোগ)।

এটি শ্রেণীর টেম্পলেটগুলির মধ্যেও সহায়ক, যেখানে ইনজেকশন শ্রেণীর নামটি কোনও টেম্পলেট যুক্তি তালিকা ছাড়াই ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ Fooপুরো টেম্পলেট-আইডির পরিবর্তে কেবলমাত্র ব্যবহার করা Foo<blah, blah, blah>, সুতরাং বর্তমান তাত্ক্ষণিকতার উল্লেখ করা সহজ। সি ++ 98 এবং সি ++ 03 এর মধ্যে পরিবর্তনের জন্য ডিআর 176 দেখুন যা এটি স্পষ্ট করেছে।

ইনজেকশন করা শ্রেণীর নামের ধারণাটি C ++ 98-এ উপস্থিত ছিল, তবে পরিভাষাটি C ++ 03 এর জন্য নতুন ছিল।

সি ++ 98 বলেছেন:

একটি শ্রেণী-নাম সুযোগ যা তা অবিলম্বে ঘোষিত হয় পরে ঢোকানো হয় ক্লাস-নাম দেখা যায়। ক্লাস-নামটিও বর্গের মধ্যেই itselfোকানো হয়।

দ্বিতীয় বাক্যটি ডিআর 147 দ্বারা পরিবর্তিত হয়েছে সুতরাং সি ++ 03 [ক্লাস] / 2 তে বলেছেন:

একটি শ্রেণী-নাম সুযোগ যা তা অবিলম্বে ঘোষিত হয় পরে ঢোকানো হয় ক্লাস-নাম দেখা যায়। শ্রেণী-নাম এছাড়াও বর্গ নিজেই সুযোগ ঢোকানো হয়; এটি ইনজেকশন-শ্রেণি-নাম হিসাবে পরিচিত ।

সি ++ 98 এর আগেও, এআরএম মোটামুটি সমতুল্য শব্দ রয়েছে যার অর্থ ক্লাসের নামটি বর্গের বডিতে সর্বদা ক্লাসের জন্যই ব্যবহৃত হতে পারে:

ক্লাসের নামটি ক্লাসের নাম হিসাবে শ্রেণীর নাম হিসাবেও ব্যবহৃত হতে পারে এমনকি শ্রেণীর নির্দিষ্টকরণকারীর নিজের সদস্যের তালিকার মধ্যেও ।

  • উদাহরণ স্বরূপ,

    class link { link* next; };


2
আমাকে প্রায়শই জিজ্ঞাসা করা হয়েছিল, তবে সমস্যাটিকে নির্দেশ করে কখনও সাধারণ উদাহরণ তৈরি করতে পারেনি। সুতরাং উদাহরণস্বরূপ +1।

1
এটি স্পষ্টভাবে দেখা যায় যদি আপনি ঝাঁকুনি +++ আপনার_প্রগ্রাম সি.পি.-এক্সক্ল্যাং -স্টাস্ট-ডাম্প চালান এবং আপনি আপনার ক্লাস এবং তারপরে একটি ইঞ্জেকশন শ্রেণীর শিশু নোডটি দেখেন।
xaxxon
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.