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

مراجعة - هيكلية الموظفين

جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 55 من 104.

challenge icon

التحدي

سهل

لنقم ببناء نظام تسلسل هرمي كامل للموظفين يجمع بين جميع مفاهيم الوراثة التي تعلمتها في هذا الفصل. ستقوم بإنشاء هيكل شركة مع أنواع مختلفة من الموظفين الذين يتشاركون في سمات عامة ولكن لديهم سلوكيات متخصصة.

ستقوم بتنظيم الكود الخاص بك عبر أربعة ملفات:

  • Employee.h: قم بتعريف الفئة الأساسية Employee التي ستشتق منها جميع أنواع الموظفين. كل موظف لديه اسم، ومعرف (ID)، وراتب أساسي. قم بتضمين:
    • أعضاء محميين (Protected) للاسم (std::string)، والمعرف (int)، والراتب الأساسي (double)
    • منشئ (Constructor) يقوم بتهيئة القيم الثلاث جميعها
    • دالة افتراضية (virtual) باسم displayInfo() تطبع: Employee: <name> (ID: <id>)
    • دالة افتراضية (virtual) باسم calculateSalary() تعيد الراتب الأساسي
    • مدمر افتراضي (virtual destructor)
  • Manager.h: قم بتعريف فئة Manager التي ترث علنًا (publicly) من Employee. يحصل المديرون على مكافأة بناءً على حجم فريقهم:
    • عضو خاص (private) باسم int teamSize
    • منشئ يأخذ الاسم، والمعرف، والراتب الأساسي، وحجم الفريق — وقم بربطه بمنشئ الفئة الأساسية بشكل مناسب
    • قم بعمل override للدالة displayInfo() لتطبع: Manager: <name> (ID: <id>) - Team of <teamSize>
    • قم بعمل override للدالة calculateSalary() لتعيد الراتب الأساسي بالإضافة إلى 500 لكل عضو في الفريق
  • Developer.h: قم بتعريف فئة Developer التي ترث علنًا من Employee. المطورون لديهم لغة تخصص ويحصلون على مكافأة مهارة:
    • عضو خاص باسم std::string language
    • منشئ يأخذ الاسم، والمعرف، والراتب الأساسي، ولغة البرمجة
    • قم بعمل override للدالة displayInfo() لتطبع: Developer: <name> (ID: <id>) - <language>
    • قم بعمل override للدالة calculateSalary() لتعيد الراتب الأساسي بالإضافة إلى مكافأة مهارة قدرها 1000
  • main.cpp: اقرأ ستة مدخلات (كل منها في سطر منفصل):
    1. اسم المدير
    2. معرف المدير
    3. الراتب الأساسي للمدير
    4. اسم المطور
    5. معرف المطور
    6. الراتب الأساسي للمطور

    قم بإنشاء مدير (Manager) بحجم فريق 4 ومطور (Developer) يتخصص في "C++". قم بتخزين مؤشرات لكليهما في مصفوفة من مؤشرات Employee*. قم بالمرور عبر المصفوفة لاستدعاء displayInfo() وطباعة الراتب المحسوب لكل موظف بهذا التنسيق:

    <displayInfo output>
    Salary: <displayInfo output>
    Salary: $<calculated salary>lt;calculated salary>

    اطبع سطرًا فارغًا بين الموظفين. بعد عرض جميع الموظفين، قم بحذف الكائنات المخصصة ديناميكيًا بشكل صحيح.

على سبيل المثال، مع المدخلات Sarah، و 101، و 5000، و Mike، و 102، و 4500:

Manager: Sarah (ID: 101) - Team of 4
Salary: $7000

Developer: Mike (ID: 102) - C++
Salary: $5500

يوضح هذا التحدي تعدد الأشكال (polymorphism) قيد التنفيذ — حيث يؤدي استدعاء الدوال الافتراضية من خلال مؤشرات الفئة الأساسية إلى استدعاء تطبيقات الفئة المشتقة الصحيحة. تذكر استخدام الكلمة المفتاحية override وتضمين مدمر افتراضي في فئتك الأساسية لضمان التنظيف السليم للذاكرة.

جرّب بنفسك

#include <iostream>
#include <string>
#include "Employee.h"
#include "Manager.h"
#include "Developer.h"

using namespace std;

int main() {
    // قراءة مدخلات Manager
    string managerName;
    int managerId;
    double managerSalary;
    
    getline(cin, managerName);
    cin >> managerId;
    cin >> managerSalary;
    cin.ignore();
    
    // قراءة مدخلات Developer
    string developerName;
    int developerId;
    double developerSalary;
    
    getline(cin, developerName);
    cin >> developerId;
    cin >> developerSalary;
    
    // TODO: إنشاء Manager بحجم فريق 4
    // TODO: إنشاء Developer متخصص في "C++"
    
    // TODO: إنشاء مصفوفة من مؤشرات Employee* لتخزين كلا الموظفين
    
    // TODO: التكرار عبر المصفوفة ولكل موظف:
    //   - استدعاء displayInfo()
    //   - طباعة: Salary: $<calculated salary>
    //   - طباعة سطر فارغ بين الموظفين (ليس بعد الموظف الأخير)
    
    // TODO: حذف الكائنات المخصصة ديناميكيًا
    
    return 0;
}

جميع دروس Object Oriented Programming