নিজেকে সংকলকের অবস্থানে রাখুন: আপনি যখন কোনও প্রকার ঘোষণা করেন, সমস্ত সংকলক জানেন যে এই ধরণের উপস্থিত রয়েছে; এটি এর আকার, সদস্য বা পদ্ধতি সম্পর্কে কিছুই জানে না। এ কারণেই একে অসম্পূর্ণ প্রকার বলা হয় । সুতরাং, আপনি সদস্যটি বা বেস ক্লাসটি ঘোষণার জন্য টাইপটি ব্যবহার করতে পারবেন না, যেহেতু সংকলকটির ধরণের বিন্যাসটি জানা দরকার।
নিম্নলিখিত সামনের ঘোষণাটি ধরে নেওয়া।
class X;
আপনি যা করতে পারেন এবং কী করতে পারবেন না তা এখানে।
অসম্পূর্ণ প্রকারের মাধ্যমে আপনি কী করতে পারেন:
কোনও সদস্যকে পয়েন্টার বা অসম্পূর্ণ প্রকারের রেফারেন্স হিসাবে ঘোষণা করুন:
class Foo {
X *p;
X &r;
};
অসম্পূর্ণ প্রকারগুলি গ্রহণ করে / ফেরত দেয় এমন ফাংশন বা পদ্ধতিগুলি ঘোষণা করুন :
void f1(X);
X f2();
অসম্পূর্ণ প্রকারের (তবে এর সদস্যদের ব্যবহার না করে) পয়েন্টার / রেফারেন্স গ্রহণ / ফিরিয়ে দেওয়ার জন্য এমন কার্য বা পদ্ধতিগুলি সংজ্ঞায়িত করুন :
void f3(X*, X&) {}
X& f4() {}
X* f5() {}
অসম্পূর্ণ প্রকারের সাথে আপনি কী করতে পারবেন না:
এটি বেস শ্রেণি হিসাবে ব্যবহার করুন
class Foo : X {} // compiler error!
সদস্য ঘোষণা করার জন্য এটি ব্যবহার করুন:
class Foo {
X m; // compiler error!
};
এই ধরণের ব্যবহার করে ফাংশন বা পদ্ধতিগুলি সংজ্ঞায়িত করুন
void f1(X x) {} // compiler error!
X f2() {} // compiler error!
এর পদ্ধতি বা ক্ষেত্রগুলি ব্যবহার করুন, প্রকৃতপক্ষে অসম্পূর্ণ প্রকারের সাথে একটি ভেরিয়েবলকে অবজ্ঞার চেষ্টা করছেন
class Foo {
X *m;
void method()
{
m->someMethod(); // compiler error!
int i = m->someField; // compiler error!
}
};
এটি যখন টেম্পলেটগুলির ক্ষেত্রে আসে তখন এর কোনও নিখুঁত নিয়ম থাকে না: আপনি কোনও টেম্পলেট প্যারামিটার হিসাবে অসম্পূর্ণ প্রকারটি ব্যবহার করতে পারেন কিনা তা এই ধরণের টেমপ্লেটে কীভাবে ব্যবহৃত হয় তার উপর নির্ভরশীল।
উদাহরণস্বরূপ, std::vector<T>
এর প্যারামিটারটি একটি সম্পূর্ণ ধরণের হওয়া boost::container::vector<T>
দরকার , যদিও না। কখনও কখনও, আপনি যদি নির্দিষ্ট সদস্য ফাংশন ব্যবহার করেন তবে একটি সম্পূর্ণ ধরণের প্রয়োজন; উদাহরণস্বরূপ, এটি ক্ষেত্রেstd::unique_ptr<T>
।
একটি ভাল-ডকুমেন্টেড টেম্পলেটটি তার ডকুমেন্টেশনে তার পরামিতিগুলির সমস্ত প্রয়োজনীয়তাগুলি নির্দেশ করতে হবে, যাতে তাদের সম্পূর্ণ ধরণের হওয়া দরকার কি না including