دروس الوحدة (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 التي ترجع القيمة.
إظهار التلميح
تذكر إضافة القالب <typename T>` إلى إعلان فئة Box.
الحل متاح بعد 3 من المحاولات
قم بتعريف قالب فئة Wrapper<T> ببيانات عضو عامة من النوع T، ومنشئ Wrapper(T d)، وطريقة print() التي تطبع البيانات إلى std::cout. بعد ذلك، قم بإنشاء تخصص كامل لـ Wrapper<char> حيث تقوم طريقة print() بطباعة الحرف المحاط بعلامات اقتباس مفردة (على سبيل المثال، 'A' بدلاً من A).
إظهار التلميح
استخدم `القالب <>` للإشارة إلى التخصص الإجمالي لـ `المجمع<شار>`.
الحل متاح بعد 3 من المحاولات