Download presentation
Presentation is loading. Please wait.
1
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות
2
Function Templates המטרה: פונקציות גנריות (מתאימות לכל טיפוס נתונים) בלי שנצטרך להגדירן מחדש. intint void swap (int& x, int& y) { int int temp = x; x = y; y = temp; } doubledoube void swap (double& x, doube& y) { double double temp = x; x = y; y = temp; } PointPoint void swap (Point& x, Point& y) { Point Point temp = x; x = y; y = temp; }
3
Function Templates template template TT void swap (T& x, T& y) { T T temp = x; x = y; y = temp; } הגדרת הפונקציה כ-template רשימת הפרמטרים בתוך שימוש בפרמטר ה-template int main(){ int i1 = 0, i2 = 1; swap(i1, i1); Point p1(2,7), p2(4,3); swap(p1, p2); } הקומפיילר יגדיר את הפונקציה swap(int&, int&) הקומפיילר יגדיר גם את הפונקציה swap(Point&, Point&)
4
Function Templates template T min (T x, T y) { return (x<y)?x:y; } int main() { inti = 3; doubled = 1.0; cout<<min(i,d)<<endl; // error … } הפונקציה min כפי שהיא מוגדרת צריכה לקבל שני ארגומנטים מאותו טיפוס
5
Function Templates template void swap (T& x, S& y) { T temp = x; x = y; y = temp; } אפשר להגדיר template שמקבל יותר מפרמטר אחד. למשל: שימו לב שבפונקציה הזאת עדיין יש הצבה של שני משתנים מטיפוסים שונים וזה עלול לגרום לאזהרות
6
Function Templates template T min (T x, T y) { return (x<y)?x:y; } int main() { inti = 3; doubled = 1.0; cout (i,d)<<endl; // o.k. … } אפשר גם לקרוא לפונקציה עם טיפוס ספציפי, לדוגמא:
7
Function Templates מה קורה ב- overloading? כיצד מחליט הקומפיילר לאיזו פונקציה לקרוא כאשר יש יותר מפונקציה אחת מתאימה? סדר העדיפויות הוא: 1.התאמה מדויקת לפונקציה שהיא לא template 2.התאמה מדויקת בעזרת שימוש ב-template 3.התאמה עם המרה לפי הסדר הבא: a)המרות שמרחיבות טיפוס אך מאותו סוג (int long) b)המרות סטנדרטיות (int double) c)המרות שהמתכנת הגדיר (char* String) רצוי להשתמש בשמות שונים לפונקציות template וכאלו שאינן template על מנת למנוע בלבול
8
Class Template ניתן להגדיר גם מחלקה בעזרת תבנית נוח בייחוד במחלקות המגדירות מבני נתונים –בעזרת התבנית מבנה הנתונים יוכל להכיל נתונים מטיפוסים שונים
9
Class Templates template template class Array { int size; T T *data; public: T explicit Array(int s=0){size = s; data = new T[size];} Array(const Array &a); ~Array() {delete[] data;} Array& operator=(const Array &a); T T& operator[](int i); Array& resize(int s); };
10
Class Templates template template T T& Array ::operator[](int i) { if((i size-1)) exit(1); return data[i]; } template template Array & Array ::resize(int s) { TT T* New = new T[s]; for(int i=0; i<s && i<size; i++) New[i] = data[i]; delete[] data; data = New; size = s; return *this; } ! הגדרת member functions שהן template חייבת להיות בקובץ header אחרת linkage error
11
Class Templates int main() { Array a(5); Array b(6); Array c(10); Array > mat; } שימו לב לרווח ! ללא הרווח זה אופרטור <<
12
דוגמא: רשימה מקושרת
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.