الگوریتمستان

یادداشت‌های یک معلم علاقه‌مند به نوشتن از آنچه آموخته و یاد می‌دهد
 

  

✤  قالب‌ها در ++C

یکی از امکانات جالب و مفید زبان ++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 >

  

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

مسعود اقدسی فام

مسعود اقدسی فام هستم.

دانش‌آموخته علوم کامپیوتر و فعال حوزه‌های برنامه‌نویسی پایتون، علم داده و یادگیری ماشین

algs.ir/spa7yei     اشتراک‌گذاری در LinkedIn     اشتراک‌گذاری در Twitter     ارسال با Telegram
نوشته‌ها از این دست
آخرین نوشته‌ها
نوشته‌های پرمخاطب
  • 1
  • 2
  • 3
  • 4
  • 5

نام: *  

پست الکترونیک (محرمانه):

متن پیام: *  

01 02 06 07 08 09 10 11 12 13 14

• hamed
۲۹ تیر ۱۳۸۶، ساعت ۰۴:۴۶

سلام من نمیدونم بلدی یا نه اگه میتونی با دو تا متغیر عمل جابجایی رو انجام بده خوشتیپ من انجام دادم

• احسان
۲۴ آذر ۱۳۸۶، ساعت ۲۲:۳۲

سلام.خسته نباشيد.واقعا سايتتونحرف نداره...فقط اگه ممكنه يكم در مورد درخت هاي Heap  توضيح بدين

• mahdi
۱۶ بهمن ۱۳۸۶، ساعت ۲۲:۵۲

با سلام

خوب بود.

ضمنا خودم هم دانشجو هستم.

خداحافظ

M.A

• آنا
۲۲ آبان ۱۳۸۸، ساعت ۱۲:۲۰

واقعا ازتون ممنونم.خسته نباشین

۲۳ آبان ۱۳۸۸، ساعت ۱۸:۱۳
• مسعود اقدسی فام

مرسی. من هم از لطف شما ممنونم.

• گلناز
۵ بهمن ۱۳۸۹، ساعت ۱۹:۱۹

سلام یه مقاله کامل در مورد ساختار  template  در ++cسراغ ندارین؟یا آدرس سایت یا وبلاگی در همین رابطه؟با تشکر

۸ بهمن ۱۳۸۹، ساعت ۱۵:۲۸
• مسعود اقدسی فام

نه متاسفانه.

• مهدی م
۱۳ دی ۱۳۹۲، ساعت ۱۶:۴۸

سلام

منظور از& ک درتابع استفاده کردید چیه--->(swap(&a,&b

۱۶ دی ۱۳۹۲، ساعت ۱۶:۲۸
• مسعود اقدسی فام

از این کاراکتر برای مشخص کردن متغیر مرجع در زمان تعریف متغیر استفاده می‌شه. در مورد متغیرهای مرجع مطلب جداگانه‌ای روی سایت هست.

• فاطمه سادات
۳۰ فروردین ۱۳۹۳، ساعت ۱۱:۵۱

به نظرم خیلی ناقص بود..

به هر حال ممنون

• Arash
۲۰ مرداد ۱۳۹۳، ساعت ۱۹:۰۵

سوال،،

چگونه میتوان از یک کلاس با خاصیت تمپلیت یک .ارایه از اشیایی ساخت که مثلا اگر آن آرایه دارای 3 اندیس باشد اندیس اولش از نوع بولن دومش از نوع اعشار و سومش از نوع عدد صحیح باشد؟

من خودم بلدم یک آرایه از یک کلاس تمپلیت تعریف کنم ولی فقط میتونم آرایه هایی رو تعریف کنم همه اشیا اون از یک نوع و یک جنس هستن.... مثلا یک آرایه با 10 اندیس که همه اون اندیس ها از نوع بولن هستن..... وقتی که میخوام هر اندیس نوع خودشو داشته باشه کامپایلر خطا میده که لیست آرگومان های کلاس تمپلیت ناقصه!!! بعد از یک ماه جستجو فهمیدم که باید برای همچین شرایطی برای لیست از یک استراکچر استفاده کرد.... اما چطور نمیدونم..... امیدوارم که راهی برای حل این مشکل باشه....

• یلدا
۱۹ اردیبهشت ۱۳۹۴، ساعت ۱۰:۳۷

کوتاه و مختصر

عالی بود

0612

• ساسان
۱۵ اسفند ۱۳۹۴، ساعت ۰۹:۲۱

واقعا ممنون واقعا ممنون

عالیه این سایت121212

• سیدرضا بازیار
۲۴ اردیبهشت ۱۳۹۵، ساعت ۰۸:۴۵

ممنون

استفاده کردم