Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

قوائم تهيئة المنشئ

جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 22 من 104.

لقد رأيت صيغة النقطتين في دروس سابقة مثل Player(std::string n, int h) : name(n), health(h) {}. تُسمّى هذه قائمة تهيئة الأعضاء، وهي الطريقة المفضّلة لتهيئة الأعضاء في C++.

تظهر قائمة initializer بعد قائمة معلمات constructor، وتبدأ بنقطتين. تتم تهيئة كل عضو مباشرةً بقيمته، مع الفصل بينها بفواصل:

class Rectangle {
    int width;
    int height;
    const int id;
    int& reference;
public:
    Rectangle(int w, int h, int i, int& r) 
        : width(w), height(h), id(i), reference(r) {
        // جسم المُنشئ (يمكن أن يكون فارغًا)
    }
};

لماذا نستخدم قوائم التهيئة بدلًا من الإسناد في جسم المُنشئ؟ عند استخدام الإسناد، يتم أولًا إنشاء الأعضاء باستخدام المُنشئ الافتراضي، ثم تُسنَد إليها قيم جديدة. أما باستخدام قوائم التهيئة، فتُنشأ الأعضاء مباشرةً بالقيم الصحيحة — وهذا أكثر كفاءة، ويكون مطلوبًا أحيانًا.

يجب تهيئة أعضاء معيّنين باستخدام القائمة:

  • أعضاء const - لا يمكن إسناد قيم إليها بعد الإنشاء
  • الأعضاء المرجعية - يجب ربطها عند التهيئة
  • الأعضاء الذين ليس لديهم مُنشئات افتراضية
class Player {
    const int maxHealth;    // يجب استخدام قائمة التهيئة
    std::string name;
public:
    // هذا يعمل
    Player(int max, std::string n) : maxHealth(max), name(n) {}
    
    // هذا لن يتم تجميعه:
    // Player(int max) { maxHealth = max; }  // خطأ!
};

تتم تهيئة الأعضاء بالترتيب الذي تم فيه declared داخل class، وليس بترتيب قائمة initializer. اكتب دائمًا قائمة initializer بترتيب التصريح لتجنب الالتباس.

challenge icon

التحدي

سهل

لنبنِ نظام تهيئة لمحرك لعبة يوضّح متى ولماذا تكون قوائم تهيئة الأعضاء ضرورية. ستنشئ GameConfig class مع أعضاء يجب تهيئتها باستخدام صيغة قائمة التهيئة.

ستنشئ ملفين لتنظيم الكود:

  • GameConfig.h: عرّف GameConfig class لتخزين إعدادات اللعبة. يجب أن تحتوي class على:
    • const std::string gameName: عنوان اللعبة، والذي لا يمكن تغييره بعد الإنشاء
    • const int maxPlayers: الحد الأقصى لعدد اللاعبين، ويُثبَّت عند الإنشاء
    • int& difficultyRef: مرجع إلى إعداد difficulty external
    • int screenWidth وint screenHeight: أعضاء عاديون لإعدادات العرض
    • constructor يأخذ جميع المعاملات اللازمة ويهيّئ EVERY عضو باستخدام قائمة التهيئة. يجب أن تتبع قائمة التهيئة ترتيب تعريف الأعضاء في class
    • دالة display() تطبع configuration بهذا التنسيق:
      Game: <gameName>
      Max Players: <maxPlayers>
      Difficulty: <difficultyRef value>
      Resolution: <screenWidth>x<screenHeight>
  • main.cpp: اقرأ قيم configuration من الإدخال وأنشئ كائن GameConfig. ستحتاج إلى:
    • قراءة اسم اللعبة (string)، وعدد اللاعبين الأقصى (int)، وdifficulty (int)، والعرض (int)، والارتفاع (int) من الإدخال: كل قيمة في سطر منفصل
    • إنشاء متغير محلي من النوع int لـ difficulty، بحيث يشير إليه config
    • إنشاء كائن GameConfig باستخدام initializer list constructor
    • استدعاء display() لعرض initial configuration
    • تعديل متغير difficulty مباشرةً (وضربه في 2)
    • طباعة "After difficulty change:"
    • استدعاء display() مرة أخرى لإظهار أن المرجع يعكس القيمة المحدَّثة

يتناول هذا التحدي سبب أهمية قوائم التهيئة: لا يمكن إسناد أعضاء const وعضو المرجع الخاص بك داخل جسم constructor. يجب تهيئتها في القائمة. يوضّح عضو المرجع أيضًا كيف تنعكس التغييرات التي تطرأ على المتغير الأصلي من خلال كائن config.

ضمّن ملف الترويسة الخاص بك في main.cpp باستخدام #include "GameConfig.h".

جرّب بنفسك

#include <iostream>
#include <string>
#include "GameConfig.h"

using namespace std;

int main() {
    // اقرأ قيم الإدخال
    string gameName;
    getline(cin, gameName);
    
    int maxPlayers;
    cin >> maxPlayers;
    
    int difficulty;
    cin >> difficulty;
    
    int width;
    cin >> width;
    
    int height;
    cin >> height;
    
    // TODO: أنشئ كائن GameConfig باستخدام مُنشئ قائمة التهيئة
    // يجب أن يستقبل المُنشئ: gameName, maxPlayers, difficulty (بالمرجع), width, height
    
    // TODO: استدعِ display() لعرض التكوين الأولي
    
    // TODO: عدّل متغير difficulty مباشرة (اضربه في 2)
    
    // TODO: Print "After difficulty change:"
    
    // TODO: استدعِ display() مرة أخرى لعرض التكوين المحدّث
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C++ عبر الإنترنت