תכנות מונחה עצמים א` – תש"ע
Download
Report
Transcript תכנות מונחה עצמים א` – תש"ע
תכנות מונחה עצמים
ופיתוח משחקים – תשע"ד
תבניות
( )Templates
1
מטרה
הגדרת מבנה נתונים או פונקציה ,של נתונים כלליים.
דוגמא למבנה נתונים של נתונים כלליים:
דוגמא לפונקציה של נתונים כלליים:
2
עץ בינארי יכול להכיל מספרים שלמים ,או אנשים ,או נקודות במישור ,או
רשימות משורשרות.
פונקצית השוואה יכולה להתייחס למספרים שלמים ,או למחרוזות ,או
למערכים.
פתרונות ליישום כלליות
שכפול קוד והתאמתו לסוג הנתונים.
כפל קוד (מסורבל וקשה לתחזוקה).
שימוש בירושה ובפולימורפיזם (מגדירים מחלקה בסיסית שממנה
יורשות מחלקות עוטפות לסוג הנתונים הרצויים .מבנה הנתונים או
הפונקציה יוגדרו ביחס לאובייקט של המחלקה הבסיסית).
ניתן להגדיר מבנה נתונים המכיל בו זמנית טיפוסים שונים.
לא ניתן ליצור מבנה נתונים של טיפוסים פרמיטיביים.
צריך לרשת מהאובייקט הבסיסי.
קיימת תקורה בהפעלה של פונקציה וירטואלית.
3
פתרונות ליישום כלליות
שימוש במצביע מסוג *.void
ההמרות מתבצעות ע"י המפתח .הקומפיילר אינו מבצע בדיקות
התאמה.
שימוש בתבניות.
שכפול קוד המתבצע על ידי הקומפלייר.
יעיל מאוד בזמן ריצה.
זמן קומפילציה ארוך וקוד הרצה בעל נפח רב.
מורכב לכתיבה.
אינו מאפשר לשלב סוגים שונים של נתונים במבנה אחד.
4
תבניות של פונקציות
5
העמסה של פונקציות :מספר פונקציות בעלות שם זהה ,ארגומנטים
ומימוש שונים.
תבנית של פונקציה :מימוש אחיד ואחידות מסוימת בארגומנטים,
ביחס לטיפוסים שונים.
דוגמא :פונקצית מיון תבצע אלגוריתם זהה עבור טיפוסים שונים -
.char* ,float ,double ,int
תבניות של פונקציות -הגדרה
6
>template <class T
>template <typename T
>…template <class T1, class T2,
T,T1,T2מייצגים טיפוס כללי.
הטיפוסים הכלליים ייצגו ארגומנטים לפונקציה ,ערכי החזרה
מהפונקציה ומשתנים המוגדרים בפונקציה.
דוגמא .fig11_01.cpp
שימוש בטיפוס שהוא מחלקה .templateTypeClass.cpp
הקוד מגדיר תנאים שונים שהטיפוסים צריכים לקיים.
פעולת הקומפיילר.
רשימת ארגומנטים
ניתן להגדיר את אותה הפונקציה פעם אחת כתבנית ופעם אחת
כפונקציה רגילה .תהיה עדיפות לשימוש בפונקציה הרגילה.
הסקה אוטומטית של טיפוסים )(automatic type deduction
תתאפשר רק אם רשימת הארגומנטים לפונקציה תכלול את כל
הטיפוסים המופיעים בהגדרת התבנית:
>template <class T1,class T2
} ;void f1( T1 t1, T2 t2 ) { T2 data
>template <class T1,class T2
} ;void f2( T1 t1 ) { T2 data
// OK
// Error
7
{ ) (int main
;( ’f1( 3.5, ’s
;) f2( 3.5
}
רשימת ארגומנטים
:אבל אפשר לכתוב כך
template <class T1,class T2>
void f1( T1 t1, T2 t2 ) { T2 data; }
template <class T1,class T2>
void f2( T1 t1 ) { T2 data; }
int main( ) {
f1<double,char>( 3.5, ’s’ (;
f2<double,int>( 3.5 );
}
// OK
// OK
8
תבניות של מחלקות
תבנית של מחלקה :הגדרה ומימוש אחידים של מחלקה ביחס
לטיפוסים שונים.
מאפשר הגדרה של מבני נתונים כלליים.
דוגמא :מחסנית של .Imployee ,char ,double ,int
הגדרת תבנית של מחלקה:
>template <class T
{ class Stack
:
;}
9
דוגמא .Fig11_02_04.zip
מימוש תבניות של פונקציות
10
קוד של תבנית פונקציה יפרש ביחס לקריאות לאותה פונקציה.
תזכורת :לעיתים קבצי המימוש ( )*.cppמתקמפלים בנפרד משאר
קבצי האפליקציה (.)main.cpp
הפרישה אינה מוגדרת אם הקומפילציה נפרדת משאר קבצי
האפליקציה.
פתרון לכך :מימוש של תבנית של פונקציה או מימוש של פונקציה
המוגדרת בתבנית של מחלקה יימצא יחד עם ההצהרות (בקובץ
.)*.h
ארגומנטים של תבניות
רשימת הארגומנטים יכולה להכיל טיפוס כללי או משתנה מטיפוס
מסוים שישמש כקבוע:
>template <class T, int SIZE
{ class A
;]T _array[SIZE
;}
{ )(int main
;A<double,70> arr1
;A<int,10> arr2
}
11
ארגומנטים של תבניות
:דוגמא נוספת
template <class T, T val>
class A {
public:
void f() { cout << val << endl; }
};
int main() {
A<int,7> a1;
A<char,’s’> a2;
a1.f();
a2.f();
}
12
ערכי ברירת מחדל של ארגומנטים
:ארגומנטים של תבניות יכולים לקבל ערכי ברירת מחדל
template <class T = float, int elements = 100>
class Stack { ....} ;
int main() {
Stack<> s1;
Stack <int> s2;
Stack <Point,30> s3;
:
}
13
תבניות ייחודיות
תבניות מאפיינות מקרים רבים.
לעיתים נרצה לממש תבנית של פונקציה או תבנית של מחלקה
למקרה פרטי באופן ייחודי (.)template specialization
תבנית ייחודית עבור פונקציה :פונקציה בעלת ממשק זהה ומימוש
שונה ,ביחס לטיפוס מסוים.
דוגמא לפונקצית השוואה הממומשת באופן ייחודי למקרה של
*.char
14
הדוגמא הקודמת הייתה פועלת עבור אובייקטים ממחלקה > A<stringללא
תבנית ייחודית.
תבניות ייחודיות
15
תבנית ייחודית עבור מחלקה :מחלקה המוגדרת וממומשת באופן
שונה ,ביחס לטיפוס מסוים.
דוגמא למחלקה הממומשת באופן ייחודי למקרה של .char
ניתן להגדיר תבנית ייחודית למשפחה של מקרים .דוגמא.
דוגמא למיון גנרי
מיון כללי בעזרת תבניות:
16
מיון מערך מטיפוס כללי.
מיון מבנה נתונים כללי ,מטיפוס כללי.
מיון מבנה נתונים כללי ,מטיפוס כללי ,ביחס לפונקצית השוואה
כללית.
תבניות ,ירושה ,ופולימורפיזם
תבניות ,ירושה ,ופולימורפיזם הם מנגנונים המאפשרים גנריות.
נסביר את המשותף ,השונה ואת אפשרויות השילוב ביניהם:
17
תבנית המתפקדת בצורה דומה לפולימורפיזם בזמן קומפילציה.
תבנית ביחס לטיפוסים המקיימים ביניהם היררכית ירושה (>*,List<Shape
>*.)List<Obj
היררכית ירושה של תבניות (>,Tree<T> ,List<T> ,Vector<T
> ,Stack<Tיורשים מ.)DataStruct<T>-
דוגמאות
סיכום
18
תבניות מתאימות במיוחד עבור כתיבת קוד תבניתי (מבני נתונים
ופונקציות סטנדרטיים ביחס לטיפוסים כלליים).
פולימורפיזם בעזרת ירושה מתאים עבור המקרה שנדרשות פעולות
זהות על החלק המשותף של טיפוסים שונים ,או פעולות שונות על
הטיפוסים השונים.
תבניות :הקישור בין פונקציה או מבנה נתונים לבין טיפוס מסוים
מתבצע בזמן קומפילציה.
פולימורפיזם :הקישור בין פונקציה לטיפוס מסוים מתבצע בזמן
ריצה.
סיכום (המשך)
19
תבניות :זמן קומפילציה ארוך ,קובץ הרצה בעל נפח רב ,יעיל
מבחינת זמן ריצה.
פולימורפיזם :להיפך.
קוד תבניתי מתאים לכל טיפוס המקיים את דרישותיו .הטיפוסים
השונים אינם מוגדרים מראש.
פולימורפיזם מאפשר עבודה עם טיפוסים שונים ,בעלי מכנה
משותף ,שהוגדרו מראש.
ניתן לשלב בין תבניות לפולימורפיזם.
סיכום (המשך)
20
תבניות הן מורכבות לכתיבה ,תחזוקה ותיקונים (הטיפוסים
המיועדים צריכים לקיים תנאים שונים וקיימים כללים רבים).
רצוי לקודד תחילה ביחס לטיפוס מסוים ורק אחר כך להכליל.
לימוד תבניות מהווה בסיס טוב להבנת הספרייה הסטנדרטית.