अपने आप को संकलक की स्थिति में रखें: जब आप आगे एक प्रकार की घोषणा करते हैं, तो सभी संकलक जानते हैं कि यह प्रकार मौजूद है; यह अपने आकार, सदस्यों या विधियों के बारे में कुछ नहीं जानता है। यही कारण है कि इसे अपूर्ण प्रकार कहा जाता है । इसलिए, आप किसी सदस्य या बेस क्लास को घोषित करने के लिए टाइप का उपयोग नहीं कर सकते, क्योंकि कंपाइलर को टाइप के लेआउट को जानना होगा।
आगे की घोषणा को मानते हुए।
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>
।
एक अच्छी तरह से प्रलेखित टेम्पलेट को अपने दस्तावेज़ों में अपने मापदंडों की सभी आवश्यकताओं को इंगित करना चाहिए, जिसमें यह भी शामिल है कि उन्हें पूर्ण प्रकार की आवश्यकता है या नहीं।