الانتقال إلى المحتوى الرئيسي
الوحدة 8 · الدرس 2 من 218/18 في الدورة~15 min
دروس الوحدة (2/2)

قوالب الصف

تمامًا مثل الوظائف، يمكن أيضًا تحديد معلمات الفئات فيما يتعلق بنوع واحد أو أكثر من أنواع البيانات. يتيح لنا ذلك تحديد هياكل البيانات العامة (مثل القوائم أو قوائم الانتظار أو الأكوام أو الأغلفة) التي تعمل مع أي نوع بيانات دون تكرار التعليمات البرمجية.

تحديد قالب الفصل

للإعلان عن قالب فئة، نستخدم بناء الجملة template <typename T> مباشرة قبل تعريف الفئة. داخل الفصل، يمكننا استخدام معلمة النوع T لتحديد متغيرات الأعضاء، أو أنواع الإرجاع، أو معلمات وظائف الأعضاء.

C++
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):

C++
Box<int> intBox(10);        // T becomes int
Box<double> doubleBox(3.14); // T becomes double

تخصص القالب

في بعض الأحيان نريد سلوكًا مختلفًا لقالب الفصل عندما يتم إنشاء مثيل له بنوع معين. في هذه الحالة، نحدد التخصص الإجمالي باستخدام بناء الجملة template <> متبوعًا بتعريف الفئة الذي يحدد نوع الهدف:

C++
// 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");
    }
};

جربه بنفسك

تمرين#cpp.m8.l2.e1
المحاولات: 0جارٍ التحميل…

قم بتعريف قالب فئة يسمى Box الذي يحتوي على عضو خاص يسمى قيمة من النوع T، ومنشئ يقوم بتهيئته، وطريقة عامة getValue() const التي ترجع القيمة.

جارٍ تحميل المحرر…
إظهار التلميح

تذكر إضافة القالب <typename T>` إلى إعلان فئة Box.

الحل متاح بعد 3 من المحاولات

تمرين#cpp.m8.l2.e2
المحاولات: 0جارٍ التحميل…

قم بتعريف قالب فئة Wrapper<T> ببيانات عضو عامة من النوع T، ومنشئ Wrapper(T d)، وطريقة print() التي تطبع البيانات إلى std::cout. بعد ذلك، قم بإنشاء تخصص كامل لـ Wrapper<char> حيث تقوم طريقة print() بطباعة الحرف المحاط بعلامات اقتباس مفردة (على سبيل المثال، 'A' بدلاً من A).

جارٍ تحميل المحرر…
إظهار التلميح

استخدم `القالب <>` للإشارة إلى التخصص الإجمالي لـ `المجمع&lt;شار&gt;`.

الحل متاح بعد 3 من المحاولات