سلام
توی ++c آیا پیش تعریف گر کلاس هم داریم؟
توی یه برنامه می خواهم لیستی از کلاسهای فرزند رو در کلاس والد استفاده کنم
اما هنگامی که به کامپایل میرسه میگه نمیتونه کلاس فرزند رو بشناسه!
فکر می کنم به خاطر این باشه که کلاس های فرزند بعد از کلاس والد تعریف شده اند
خیلی ممنون میشم اگه راهنمایی کنید
تشخیص مشکل بدون دیدن ساختار کدی که نوشته اید مشکله، اما از توضیحاتی که دادید حدس می زنم که شما هر دو کلاس رو در یک فایل تعریف کرده اید، ابتدا کلاس والد و سپس کلاس فرزند. روال کامپایل ابتدا به والد میرسه،
اسمی از کلاس فرزند رو داخلش می بینه که هنوز تعریفی برایش نداشته و در نتیجه با خطا متوقف میشه.
صد البته، برای کلاس پیش تعریف گر داریم، البته نه به سادگی و مختصری پیش تعریف گر توابع. دلیل اش اینه که توابع ساختار ساده ای داشتند، پیش تعریف گر باید همه ساختار کلاس رو نشون بده، تنها چیزی که می تونه نداشته باشه
کد داخل توابع و عملگر های کلاس ئه. اما پیش تعریف گر کلاس مشکل شما رو حل نمی کنه. ارتباط فرزند با والد یک طرفه است، یک والد نمی تونه وابسته به فرزند خودش باشه.
فرضا همچین کدی داریم :
کد:
class A
{
public:
A(int i)
{
id = i;
}
private:
int id;
[B][COLOR="#0000FF"] B *child;[/COLOR][/B]
};
class B : A
{
public:
B(int i): A(i)
{
}
};
قطعا
B باید بعد از
A کامپایل بشه چون
B فرزند
A است و ازش ارث بری می کنه. اما در این کد کلاس
A مشکل سازه، تعریف
A باید مستقل از فرزندان اش باشه، نباید موردی مثل child در کلاس
A قرار بگیره.
همچین چیزی در ++C مدل سازی نمیشه. اینجور موارد به سادگی قابل رفع کردنه، فقط باید تغییری در ساختار کلاس ها داده بشه، اما راه حل بستگی به هدف داره، چرا می خواهید نمونه از
B داخل
A وجود داشته باشه؟
شاید مدل مطلوب این باشه :
کد:
class A
{
public:
A(int i)
{
id = i;
}
virtual void DoSomething()
{
}
private:
A *child;
int id;
};
class B : public virtual A
{
public:
B(int i): A(i)
{
}
void DoSomething()
{
//Code
}
};
با کد بالا هم
A و هم
B شامل ()DoSomething هستند اما الزاما ()DoSomething های ایندو یکسان عمل نمی کنند. شما می توانید در child آدرس یک شیء از کلاس
B قرار دهید، کامپایل خطا نمی دهد که
باید از نوع
A باشد، همه فرزندان
A هم مورد قبول هستند. آنگاه اگر DoSomething را برای child اجرا کنید آنطور که در کلاس
B (یا هر کلاس دیگری که ازش شی ساخته اید) تعریف شده عمل خواهد کرد،
نه آنطور که در
A والد تعریف شده. یعنی می توانید در
A قالبی برای فرزندان
A ایجاد کنید و کد نویسی اش را در خود کلاس های فرزند بنویسید.
اینطوری می توانید روتین ()DoSomething ای از کلاس فرزند
B را اجرا کنید، بدون اینکه تعریف
A که والد است به
B وابسته باشه.