Şablonlar C ++

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

C ++ Şablonları

C ++ Şablonları, fərqli məlumat növləri ilə işləyə bilən ümumi funksiyalar və siniflər yaratmağa imkan verən ümumi proqramlaşdırma üsulunu təmsil edir. Müxtəlif növ obyektlərlə hərəkətləri yerinə yetirmək üçün ümumi kod hazırlamaq üçün istifadə olunan güclü C ++ mexanizmidir.

Aşağıdakı problem şablonların istifadəsinin zəruriliyinə səbəb ola bilər: “Aşağıdakı məlumat növləri üçün maksimum iki element əldə edə biləcək bir proqram yazmalısınız: int, short int, long int, double, float”.

Hər növ üçün fərqli funksiyalar yaza bilərsiniz. Ən pis həll yoludur. Ayrıca, fərqli parametrlər və dönüş növü üçün bir funksiyanı həddindən artıq yükləyə bilərsiniz. Bir az daha yaxşıdır, amma yenə də eyni davranışa sahib çox miqdarda kod yazmalısınız.

Funksiya Şablonunun Sintaksisi

Bu tapşırıq üçün ən yaxşı həll a yazmaqdır funksiya şablonu bütün bu növlərlə işləyəcəkdir.

İstifadə edərək funksiya şablonu yaradıla bilər şablon açar söz. Şablon bir funksiyanın elanında sintaksisə malikdir:

şablon <parametr siyahısı> funksiya bəyannaməsi

Parametrlər siyahısı bu şablonda istifadə olunan növlərin siyahısıdır. Bu parametrlər aşağıdakı şəkildə qurula bilər:

Sinif identifikatoru

template&lt;class T&gt;
void myFunc()
{
}

yazı adı identifikatoru

template&lt;typename T&gt;
void myFunc()
{
}

şablon <parametr siyahısı> sinif identifikatoru

class foo
{
};
template&lt;template&lt;typename T&gt; class T&gt;
void myFunc()
{
}

Qeyri-tip bir parametr

template&lt;class T, int i&gt;
void myFunc()
{
}

İlk iki halda, sinifyazı adı funksiya şablonunun parametrlərini təyin etmək üçün istifadə olunan açar sözlərdir. Üçüncüsü, başqa bir şablon üçün bir parametr olaraq bir şablon sinifindən istifadə imkanını təsvir edir. Sonuncusu, parametrlər siyahısında bir növ əvəzinə dəyər istifadə etmək imkanını əks etdirir.

Funksiya şablonunun nümunəsi

Ən çox iki ədədi qaytarmalı olan funksiya şablonunun bəyanatı və tərifi aşağıdakı şəkildə görünür:

template &lt;typename T&gt;
T max(T a, T b)
{
	return a &gt; b ? a : b;
}

Bu bəyannamə, adı olan bir şablonun işləməsi deməkdir max yaradılmışdır. Bu şablonun parametri belə adlanır T. Bu funksiyanı çağırıb şablonun arqumentini təyin edəndə, T funksiyanın hər yerində göstərilən tiplə əvəz ediləcəkdir.

Funksiya şablonunun istifadəsi

İndi operator max olan müxtəlif növlərlə max funksiyasına zəng edə bilərsiniz:

//calling max with int parameters
cout &lt;&lt; &quot;Maximum of 3 and 5 is &quot; &lt;&lt; max(3, 5) &lt;&lt; endl;
//calling max with double parameters
cout &lt;&lt; &quot;Maximum of 4.2 and 4.7 is &quot; &lt;&lt; max(4.2, 4.7) &lt;&lt; endl;

Gördüyünüz kimi, bu nümunədə şablon funksiyası yalnız eyni tip elementlərin maksimumunu əldə etməyə imkan verir, çünki parametrlər siyahısında da ab parametrlər tiplidir T. Qaytarma növü müqayisə olunan elementlərin növü ilə eynidır.

Açıq Anlaşma

Bir funksiya şablonunun hər iki parametri üçün eyni tipdən istifadə etdikdə, kompilyator avtomatik olaraq parametr tipini çıxardacaq. Bununla birlikdə, müxtəlif növ elementləri müqayisə edə bilərsiniz. Bu vəziyyətdə, zəngdəki parametrlər siyahısını göstərərək şablon funksiyasını açıq şəkildə qurmalısınız.

Məsələn, bir ədədi ikiqat ilə müqayisə edə bilərik. Şablon arqumenti göstərildikdə tam dəyər ikiqat artırılacaq:

//explicit instantiation
cout &lt;&lt; &quot;Maximum of 7.36 and 7 is &quot; &lt;&lt; max&lt;double&gt;(7.36, 7) &lt;&lt; endl;

Şablon sinfi və ya funksiya bir növ və ya bir obyekt deyil. Sadəcə müəyyən bir funksiya və ya sinif yaratmaq üçün bir plandır. Kodunuzda yalnız bir şablon tərifi varsa - əlavə kod yaradılmayacaq. Buna baxmayaraq, bir funksiya şablonundan və ya bir sinif şablonundan istifadə edib onun şablonunu göstərdiyiniz zaman
parametrlər - tərtibçi göstərilən tiplərlə həqiqi funksiyanı (sinif) edəcəkdir.

Məsələn, yuxarıdakı kod, maksimum iki tam ədədi və maksimum iki ikiqat dəyər qaytaracaq iki funksiya yaradır:

int max(int a, int b)
{
	return a &gt; b ? a : b;
}
double max(double a, double b)
{
	return a &gt; b ? a : b;
}

Bu kodu mənbə sənədlərinizdə görməyəcəksiniz, ancaq şablonların istifadə etdiyi mexanizm budur.

Birdən çox parametr şablonu

Parametrlər siyahısına müxtəlif növlər daxil edilə bilər. Bu növlər vergüllə ayrılmalı və fərqli identifikatorlara sahib olmalıdır. Məsələn, müxtəlif növ iki dəyər çıxaracaq bir şablon funksiyası yarada bilərik:

template&lt;typename T1, typename T2&gt;
void output(T1 obj1, T2 obj2)
{
	cout &lt;&lt; &quot;Obj1 is &quot; &lt;&lt; obj1 &lt;&lt; &quot;. Obj2 is &quot; &lt;&lt; obj2 &lt;&lt; endl;
}

Burada iki fərqli növ T1T2 parametr kimi istifadə olunur.

Sinif şablonu

The sinif şablonu parametr siyahısına görə fərqli siniflər yaratmaq üçün istifadə olunan bir plandır. Tez-tez, sinif şablonları qabları həyata keçirmək üçün istifadə olunur. Bir sinif şablonunun bəyannaməsi funksiya şablonunun elanına bənzəyir:

şablon<parametr siyahısı>
sinif sinif identifikatoru

Vacib qeyd

Şablon üzvü funksiyalarının bəyannaməsi və tərifi eyni başlıq sənədində edilməlidir. Sinif bəyannaməsini və tərifini başlıq (.h) və mənbə dosyasına (.cpp) ayırmaq üçün standart texnika sinif şablonu üçün tətbiq edilmir.

Sinif Şablonu Nümunəsi

Əvvəlki mövzularda tam dəyərlər yığını nümunəsi olan Stack sinfini araşdırdıq.

class myStack {
  public:
    //allocate memory for stack
    myStack(int _size = 50) {
      size = _size;
      stack = new int[size];
      //initially stack is empty
      top = -1;
    }
  //add value to stack
  bool push(int i) {
    if (isFull())
      return false;
    else {
      top++;
      stack[top] = i;
    }
  }
  int pop() {
    if (isEmpty())

      throw new exception("Stack is empty");
    else {
      return stack[top--];
    }
  }
  private:
    //return true if stack is full
    bool isFull() {
      return size == top - 1;
    }
  bool isEmpty() {
    return top == -1;
  }
  int size;
  int * stack;
  int top;
};

Bu sinif yalnız tam dəyərlərlə işləyir. Müxtəlif tipli obyektlər üçün yığın məlumat strukturunun funksiyalarını həyata keçirən bir şablon sinifimiz olsaydı, bu, əlverişli olardı.

Şablon sinifindən istifadə edərək bunu edə bilərik. Bu məqsədlə şablon parametr siyahısını əlavə edərək sinif bəyannaməsini dəyişdirməliyik. Yığın sinifinin bütün obyektləri eyni tipə malikdir, buna görə parametrlər siyahısı yalnız bir parametrdən ibarətdir:

template &lt;typename T&gt;
class myStack

İndi T tipli elementləri yığında saxlamaq istəyirik. Bu məqsədlə yığın göstəricisi, basma funksiyasının parametri və pop funksiyasının qayıtma növü T tipində olmalıdır. Bunu tez bir zamanda dəyişdirə bilərik və indi istənilən tip yığın sinifindən istifadə edirik:
template &lt;typename T&gt;
class myStack {
  public:
    //allocate memory for stack
    myStack(int _size = 50) {
      size = _size;
      //memory is allocated for type T
      stack = new T[size];
      //initially stack is empty
      top = -1;
    }
  //add value of Type T to stack
  bool push(T i) {
    if (isFull())
      return false;
    else {
      top++;
      stack[top] = i;
    }
  }
  //element of type T is returned
  T pop()

  {
    if (isEmpty())
      throw new exception("Stack is empty");
    else {
      return stack[top--];
    }
  }
  private:
    //return true if stack is full
    bool isFull() {
      return size == top - 1;
    }
  bool isEmpty() {
    return top == -1;
  }
  int size;
  //elements of type T are stored
  T * stack;
  int top;
};

Yığın tipli bir obyekt yaratmaq istəsəniz, saxlanılan elementlərin növlərini dəqiq müəyyənləşdirməlisiniz:
//list of ints
myStack&lt;int&gt; intStack(10);
//list of doubles
myStack&lt;double&gt; doubleStack(20);
//list of chars
myStack&lt;char&gt; charStack(5);

Parametrlər siyahısı üçün standart dəyərlər

Şablon parametrləri üçün standart dəyəri təyin etmək imkanı var. Şablon bəyannaməsində edilə bilər:

şablon<typename T1 = defaultType, typename T2 = defaultType,…>
sinif sinif identifikatoru

Məsələn, yığın sinfi üçün standart dəyər int olaraq təyin edilə bilər:

template &lt;typename T = int&gt;
class myStack

Bu vəziyyətdə şablonu dəqiqləşdirməsəniz, int stack varsayılan olaraq yaradılacaqdır:
//list of ints created by default
myStack&lt;&gt; intStack(10);

Gördüyünüz kimi şablonlar yaradılan siniflərin imkanlarını artırmağa imkan verir. Ümumi proqramlaşdırma üçün çox güclü bir alətdir. C ++, Standart Şablon Kitabxanasında (STL) toplanan çox sayda sinif və funksiya şablonu təklif edir. STL “C ++ STL Tutorial” da ətraflı şəkildə müzakirə olunur

Crack Sistemi Dizayn Müsahibələri
Translate »