آیا یک کلاس cpp می تواند یک شی از خودش داشته باشد؟
تعریف یک کلاس می تواند یک اشاره گر یا یک شی استاتیک از نوع خود کلاس در داخلش داشته باشد، اما یک شی غیر استاتیک را نمی تواند شامل شود.
به مثال های زیر دقت کنید:
یک شی استاتیک از نوع کلاس در داخل کلاس:
// A class can have a static member of self type
#include
using namespace std;
class Test {
static Test self; // works fine
/* other stuff in class*/
};
int main()
{
Test t;
getchar();
return 0;
}
برنامه زیر هم به درستی کار خواهد کرد.
// A class can have a pointer to self type
#include
using namespace std;
class Test {
Test * self; //works fine
/* other stuff in class*/
};
int main()
{
Test t;
getchar();
return 0;
}
اما برنامه زیرین خطای کامپایل تایم را ایجاد می کند. خطایی بامعنی “شی self یک نوع ناقص می باشد”
// A class cannot have non-static object(s) of self type.
#include
using namespace std;
class Test {
Test self; // Error
/* other stuff in class*/
};
int main()
{
Test t;
getchar();
return 0;
}
- اگر شی غیر استاتیک یک عضو باشد بنابراین تعریف کلاس ناقص یا incomplete خواهد بود و کامپایلر نمی تواند سایز شی مدنظر(شی self) را مشخص کند.
- متغیر های استاتیک در سایز آبجکت دخیل نیستند، بخاطر اینکه اعضای استاتیک به نمونه ای از کلاس یا شی ای از کلاس تعلق ندارند. بنابراین هیچ مشکلی در جهت مشخص کردن سایز شی ساخته شده از کلاس به وجود نخواهد آمد.
- برای کامپایلر، همه اشاره گرها یک سایز مشخص، متناسب با نوع داده ای که آنها به آن اشاره میکنند دارند، بنابراین هیچ مشکلی هم با داشتن اشاره گر در داخل شی ساخته شده نخواهیم داشت چون نوع داده ای که اشاره گر به آن اشاره می کند در زمان کامپایل مشخص می باشد.