जब संकलक वर्ग को संकलित करता है Userऔर MyMessageBoxलाइन पर जाता है , MyMessageBoxतो अभी तक परिभाषित नहीं किया गया है। संकलक का कोई पता नहीं हैMyMessageBox है, इसलिए आपके वर्ग के सदस्य का अर्थ नहीं समझ सकता।
सदस्य के रूप में इसका उपयोग करने से पहले आपको यह सुनिश्चित करने की आवश्यकता है कि MyMessageBoxइसे परिभाषित किया गया है । यह परिभाषा क्रम को उलट कर हल किया जाता है। हालाँकि, आपके पास एक चक्रीय निर्भरता है: यदि आप ऊपर जाते हैं , तो नाम की परिभाषा में परिभाषित नहीं किया जाएगा!MyMessageBoxUserMyMessageBoxUser
आप जो कर सकते हैं वह आगे की घोषणा है User ; यह है, इसे घोषित करें लेकिन इसे परिभाषित न करें। संकलन के दौरान, एक प्रकार जिसे घोषित किया गया है लेकिन परिभाषित नहीं किया गया है उसे अपूर्ण प्रकार कहा जाता है । सरल उदाहरण पर विचार करें:
struct foo; // foo is *declared* to be a struct, but that struct is not yet defined
struct bar
{
// this is okay, it's just a pointer;
// we can point to something without knowing how that something is defined
foo* fp;
// likewise, we can form a reference to it
void some_func(foo& fr);
// but this would be an error, as before, because it requires a definition
/* foo fooMember; */
};
struct foo // okay, now define foo!
{
int fooInt;
double fooDouble;
};
void bar::some_func(foo& fr)
{
// now that foo is defined, we can read that reference:
fr.fooInt = 111605;
fr.foDouble = 123.456;
}
आगे की घोषणा करके User, MyMessageBoxअभी भी एक सूचक या इसका संदर्भ बना सकते हैं:
class User; // let the compiler know such a class will be defined
class MyMessageBox
{
public:
// this is ok, no definitions needed yet for User (or Message)
void sendMessage(Message *msg, User *recvr);
Message receiveMessage();
vector<Message>* dataMessageList;
};
class User
{
public:
// also ok, since it's now defined
MyMessageBox dataMsgBox;
};
आप इसे अन्य तरीके से नहीं कर सकते हैं : जैसा कि उल्लेख किया गया है, एक वर्ग के सदस्य की परिभाषा होनी चाहिए। (कारण यह है कि संकलक को यह जानने की आवश्यकता है कि मेमोरी कितना Userलेती है, और यह जानने के लिए कि इसके सदस्यों के आकार को जानना आवश्यक है।) यदि आप कहना चाहते थे:
class MyMessageBox;
class User
{
public:
// size not available! it's an incomplete type
MyMessageBox dataMsgBox;
};
यह काम नहीं करेगा, क्योंकि यह अभी तक आकार नहीं जानता है।
एक साइड नोट पर, यह फ़ंक्शन:
void sendMessage(Message *msg, User *recvr);
संभवतः सूचक द्वारा उन दोनों में से कोई भी नहीं लेना चाहिए। आप एक संदेश के बिना एक संदेश नहीं भेज सकते हैं, और न ही आप इसे भेजने के लिए एक उपयोगकर्ता के बिना एक संदेश भेज सकते हैं। और उन दोनों स्थितियों को या तो पैरामीटर के लिए एक तर्क के रूप में अशक्त पारित करके व्यक्त किया जाता है (अशक्त पूरी तरह से वैध सूचक मान है!)।
बल्कि, एक संदर्भ (संभवतः कास्ट) का उपयोग करें:
void sendMessage(const Message& msg, User& recvr);