שיעורי מודול (2/2)
תבניות כיתות
בדיוק כמו פונקציות, ניתן להגדיר פרמטרים למחלקות גם ביחס לסוג נתונים אחד או יותר. זה מאפשר לנו להגדיר מבני נתונים גנריים (כגון רשימות, תורים, ערימות או עטיפות) שעובדים עם כל סוג נתונים מבלי לשכפל קוד.
הגדרת תבנית כיתה
כדי להכריז על תבנית מחלקה, אנו משתמשים בתחביר template <typename T> מיד לפני הגדרת המחלקה. בתוך המחלקה, נוכל להשתמש בפרמטר הסוג T כדי להגדיר משתני איבר, סוגי החזרה או פרמטרים של פונקציות איבר.
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
T getValue() const {
return value;
}
};מופע
בעת יצירת אובייקט של תבנית מחלקה, עלינו לציין במפורש את הסוג בין סוגריים זווית <> (אם כי החל מ-C++17, המהדר יכול להסיק זאת בהקשרים מסוימים באמצעות Class Template Argument Deduction או CTAD):
Box<int> intBox(10); // T becomes int
Box<double> doubleBox(3.14); // T becomes doubleהתמחות בתבנית
לפעמים אנו רוצים התנהגות שונה עבור תבנית מחלקה כאשר היא מופעלת עם סוג מסוים. במקרה זה, אנו מגדירים התמחות כוללת תוך שימוש בתחביר template <> ואחריו הגדרת המחלקה המציינת את סוג היעד:
// Total specialization for the bool type
template <>
class Box<bool> {
private:
bool value;
public:
Box(bool v) : value(v) {}
void printState() {
std::cout << (value ? "True" : "False");
}
};נסה זאת בעצמך
הכריז על תבנית מחלקה בשם Box שמכילה איבר פרטי בשם ערך מסוג T, בנאי שמאתחל אותה ושיטה ציבורית getValue() const שמחזירה את הערך.
הצג רמז
זכור להוסיף את `template <typename T>` להצהרת המחלקה `Box`.
הפתרון זמין לאחר 3 ניסיונות
הכריז על תבנית מחלקה Wrapper<T> עם נתוני חבר ציבורי מסוג T, בנאי Wrapper(T d), ושיטה print() שמדפיסה נתונים ל-std::cout. לאחר מכן, צור התמחות כוללת עבור Wrapper<char> כאשר שיטת print() מדפיסה את התו המוקף במרכאות בודדות (למשל, 'A' במקום A).
הצג רמז
השתמש ב-'template <>' כדי לציין את ההתמחות הכוללת של 'Wrapper<char>'.
הפתרון זמין לאחר 3 ניסיונות