C++/תבניות: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Shrek0100 (שיחה | תרומות)
הרחבת הערך, הרחבה
 
שורה 1:
תבניות הן תכונה ב++C המאפשרת לנו ליצור קוד דינאמי ובכך לחסוך בכתיבת אותו הקוד שוב ושוב. {{C++}}
{{להשלים}}
{{C++}}
==הצורך בתבניות==
על מנת להבהיר את הצורך בתבניות, נביא דוגמת קוד:<source lang="c++">
 
<source lang = "cpp">
void swap(int &a, int &b)
{
שורה 13 ⟵ 11:
 
 
קוד זה עושה פעולה פשוטה מאד: הוא מקבל שני משתנים מיוחסים ל-int ומחליף ביניהם.
<source lang = "cpp">
 
אז מה הבעיה? בואו ננסה לכתוב את אותו הקוד עבור טיפוס char:
<source lang = "cppc++">
void swap(char &a, char &b)
{
שורה 20 ⟵ 21:
b = temp;
}
</source>נראה מעט מוכר, לא?
 
נסביר מעט: ההבדל בין שתי הדוגמאות הוא רק סוגי המשתנים. חוץ מהם, הקוד זהה לחלוטין.
 
על מנת לחסוך ממנו את כתיבת אותו הקוד שוב ושוב רק כדי להתאים אותו לסוגי משתנים שונים, המציאו את התבניות. בעזרתן ניתן לכתוב קוד דינאמי שישתנה בהתאם לצורך שלנו ולסוגי המשתנים בהם נרצה להשתמש.
 
==תבניות פונקציות==
ניתן להשתמש בתבניות לפונקצייה בודדת ולהתאים אותה לצרכים שלנו. לדוגמה, הפונקציה שהצגנו לפני כן עם שימוש בתבניות תראה כך:<source lang="c++">
<source lang = "cpp">
template<typename T>
void swap(T &a, T &b)
שורה 31 ⟵ 36:
b = temp;
}
</source>ועכשיו נבין את הכתוב: בהתחלה, אנו מצהירים כי הפונקצייה שלנו היא תבנית (שורה 1) ומגדירים משתנה ששמו הוא T שישמש לנו כסוג הפונקצייה.
</source>
 
כעת, נוכל להשתמש ב-T כסוג משתנה לכל דבר ולהגדיר בעזרתו משתנים (כדוגמת המשתנה temp).
 
שימוש בפונקציה יראה כך:<syntaxhighlight lang="c++">
swap<type>(a, b);
</syntaxhighlight>
 
==תבניות מחלקות==
כשמחלקה שלמה צריכה להיות מותאמת לסוג אחד, נשתמש בתבניות מחלקות. התחביר מאד דומה לתבנית פונקציות:<syntaxhighlight lang="c++">
template<class T>
class A {
T x; <br>
T y; <br>
public:
A(T a,T b) <br>
{x=a;y=b;} <br>
T func(); <br>
};
 
template<class T>
T A::<T>func() <br>
{/*....*/}
</syntaxhighlight>
 
{{C++|מוגבל=כן}}
שורה 40 ⟵ 66:
 
<div style="direction: ltr;">
<span style="color: blue;">template</span><<span style="color: blue;">class</span> T> <br>
<span style="color: blue;">class</span> A { <br>
T x; <br>
T y; <br>
<span style="color: blue;">public</span>: <br>
A(T a,T b) <br>
{x=a;y=b;} <br>
T func(); <br>
}; <br>
 
<span style="color: blue;">template</span><<span style="color: blue;">class</span> T> <br>
T A::<T>func() <br>
{<span style="color: green;">/*....*/</span>} <br>
 
</div>