C++ Class Template
در مورد template ها در گذشته صحبت کردیم و استفاده از انها در توابع توضیح داده شد، حالا در این پست در مورد آوردن این ویژگی به کلاس ها توضیح می دهیم. استفاده از کلاس های template انعطاف پذیری کلاس را افزایش و کد نویسی را کاهش می دهد. در زیر با ارائه یک مثال، پیاده سازی کلی یک کلاس template را نشان می دهیم.
template < class T >
class Class_Name
{
public:
Class_Name (T "Variable_Name")
{
// code
}
T test (T "Variable_Name")
{
// code
}
private:
T "Variable_Name";
};
در بالا یک کلاس به صورت template تعریف کرده ایم که یک "سازنده" و یک تابع عضو دارد. قبل از هر چیز توضیح چند چیز ضروری است.
T در مثال بالا تنها یک نام است و هیچ گونه مشکلی برای تعریف نام دلخواه خود نخواهید داشت. T در واقع یک TypeName است (یک "نوع" است) است که در اینده، هنگام ایجاد یک شی از این کلاس تعریف خواهد شد.
مثال بالا تنها نمونه ساده ای از تعریف یک کلاس template است و هیچ مانعی برای برای ایجاد دهها سازنده، تابع و متغیر عضو با استفاده از نوع T وجود ندارد و همچنین مانعی برای تعریف یک کلاس با چندین TypeName نیست. برای مثال می توانید کلاس را با سه typename تعریف کنید که در هنگام ایجاد شی از کلاس به ترتیب، تعریف خواهند شد.
template < class T, class T2, class T3 >
سه نوع T ، T2 و T3 میتوانند در هر کجای کلاس به کار روند و متغیر هایی از نوع آنها تعریف کرد. البته واضح است که کلاس های مدیریت شده نمی توانند متغیر های مدیریت نشده داشته باشند، پس باید در باره ی انتخاب انواع اندیشید.
ایجاد یک شی از کلاس : همانطور که تعریف و قوانین کلاس بالا، مشابه کلاس های معمولی است، تعریف یک شیاز کلاس نیز مشابه کلاس های معمولی است با این تفاوت که باید Type Name هایی که در template تعریف کرده اید را هنگام ایجاد شی از کلاس، مشخص کنید. در زیر حالت کلی تعریف یک شی از کلاس آمده است :
Class_Name < type > Object_Name;
یا (به صورت یک اشاره گر) :
Class_Name < type > * Object_Name = new Class_Name < type > () ;
اگر کلاس شما حاوی چند type name باشد، باید آنها را به ترتیب مشخص کنید.
Class_Name < type1, type2, type3 , ... > Object_Name;
تعریف توابع در بیرون کلاس نیز مشابه کلاس های معمولی و به صورا زیر است :
template < class T >
Class_Name < T >::Function_Name (T "Variable_Name", other variables...)
{
// code
}
در بالا نمونه یک تابع بدون نوع بازگشتی آمده است که در بیرون کلاس تعریف شده است. البته این تابع باید قبلا در کلاس اعلان شده باشد.
در زیر هم نمونه یک template class را مشاهد می کنید که دارای چند تابع عضو و سازنده و type name است.
template < class T, class T2, class T3 >
class Sample
{
public:
Sample ()
{
// code
}
Sample (T ipt)
{
// code
}
~Sample()
{
// code
}
// Function declaration
void someFunc ();
T somFunc2 (T r)
{
return r;
}
private:
T j;
T2 k;
T someFunc3 (T3 p)
{
// code
}
};
+ نوشته شده در جمعه هفدهم آذر ۱۳۹۱ ساعت 21:45 توسط MEC
|
GENERAL INFORMATION