যখন সংকলক ক্লাসটি সংকলন করে User
এবং MyMessageBox
লাইনে পৌঁছায় MyMessageBox
তখনো সংজ্ঞায়িত করা হয়নি। সংকলকটির কোনও ধারণা MyMessageBox
নেই, সুতরাং আপনার শ্রেণীর সদস্যটির অর্থ বুঝতে পারি না।
সদস্য হিসাবে ব্যবহার করার আগে আপনাকে অবশ্যই MyMessageBox
এটি সংজ্ঞায়িত করা উচিত । এটি সংজ্ঞা আদেশের বিপরীতে সমাধান করা হয়। তবে আপনার একটি চক্রীয় নির্ভরতা রয়েছে: আপনি যদি উপরে চলে যান তবে নামের সংজ্ঞাটি সংজ্ঞায়িত হবে না!MyMessageBox
User
MyMessageBox
User
আপনি যা করতে পারেন তা ঘোষণা করার জন্য 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);