الگوریتمستان - آموخته های من از دنیای برنامه نویسی و طراحی الگوریتم
نسخه قابل چاپ قالبها در ++C شنبه ، 9 خرداد ماه 1388 ، ساعت 13:15

یکی از امکانات جالب و مفید زبان ++C قالبها (Templates) هستند که انعطاف زیادی به کدنویسی می دهند. مفهوم قالب را با یک مثال ساده شروع می کنم:

فرض کنید در یک برنامه نیاز به تعویض مقادیر دو تا متغیر هست. یعنی مثلا می خواهیم مقادیر a و b را با هم عوض کنیم. اگر a و b از نوع صحیح باشند، تابع جابجایی می تواند به این صورت باشد:

 

void swap( int &a, int &b )

{

  int temp;

  temp = a;

  a = b;

  b = temp;

}

 

حال اگر بخواهیم مقادیر دو تا متغیر اعشاری را عوض کنیم، تابع فوق به کار نمی آید و باید تابع جدیدی بنویسیم. اما اگه از قالب استفاده کنیم همه مشکلات حل می شوند.

به قطعه کد زیر توجه کنید:

 

template< class T >

void swap( T &a, T &b )

{

  T Temp;

  Temp = a;

  a = b;

  b = Temp;

}

 

این کد روش استفاده از قالب را نشان می دهد. وقتی کامپایلر به این قطعه کد می رسد، متوجه می شود که یک تعریف کلی از یک تابع ارائه شده است. به جای T می توان در زمان فراخوانی تابع، هر نوع داده استاندارد، ساختمان یا کلاس استفاده کرد. به عنوان مثال:

 

int n = 5, m = 6;

double x = 0.12, y = 125.6;

char a = 'A', b = 'B';

swap( n, m );

swap( x, y );

swap( a, b );

cout << " n = " << n << ", m = " << m << endl;

cout << " x = " << x << ", y = " << y << endl;

cout << " a = " << a << ", b = " << b << endl;

 

خروجی:

 

n = 6, m = 5

x = 125.6, y = 0.12

a = B, b = A

 

به عبارت ساده تر، وقتی کامپایلر به کد

swap( n, m )

می رسد، متوجه می شود که باید T را int در نظر بگیرد و . . .

همانطور که گفته شد، می توانید از اشیاء کلاسها و ساختمانها هم استفاده کنید.  اگر strval1 و strval2 دو تا متغیر از نوع ساختمان دلخواه باشند، عبارت

swap( strval1, strval2 )

کاملا درست بوده و باعث جابجایی متغیرهای متناظر ساختمانها می شود.

قالبها از تمامی امکانات ++C نظیر سربارگزاری، تعریف مجدد، پارامترهای پیش فرض و . . . پشتیبانی می کند. مهمتر از همه اینکه می توان از قالبها برای تعریف کلاسها استفاده کرد:

 

template< class T >

class myclass

{

  private:

    T a;

  public:

    myclass( T x )

    {

      set_a( x );

    }

    T get_a( )

    {

      return a;

    }

    void set_a( T x )

    {

      a = x;

    }

};

 

با توجه به تعریف فوق، برای مشخص کردن اشیاء می توان نوشت:

 

myclass<int> n( 7 );

myclass<float> d( 10.5 );

 

توجه داشته باشید که لازم نیست همه متغیرها از نوع کلی باشند. تابع زیر را در نظر بگیرید که یک آرایه و تعداد اعضای آن را دریافت کرده و این اعضا را چاپ می کند:

 

template< class T >

void print( T *arr, int n )

{

  int i;

  for ( i = 0 ; i < n ; i ++ )

  {

    cout << *( arr + i ) << endl;

  }

}

 

در ضمن می توان به جای یک نوع کلی، از چند نوع استفاده کرد:

 

template< class type1, class type2, . . . , class typeN >

 

از کاربردهای دیگر قالبها می توان به توابع مرتب سازی، توابع جستجو، پشته ها، لیست های پیوندی، درخت ها، صف ها و  . . . اشاره کرد.

ارسال پیام
دوست عزیزم، لطفا قبل از ارسال پیام به موارد زیر توجه داشته باشید:

1- حدالامکان از حروف فارسی برای نگارش پیام خود استفاده کنید. امکان ارسال پیام لاتین و کدهای برنامه نویسی با چیدمان چپ به راست نیز وجود دارد.
2- به درخواست پروژه های آماده پاسخ داده نخواهد شد.
3- پیام شما به صورت خصوصی برای نویسنده ارسال خواهد شد.

پیشاپیش از همکاریتان سپاسگذارم.


نام:  
پست الکترونیک
وب سایت:
متن پیام:  
کد تصویری: