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

مراجعة - فئة String

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

challenge icon

التحدي

سهل

لنقم ببناء فئة String كاملة تدير مصفوفة الأحرف الديناميكية الخاصة بها، مع تجميع كافة مفاهيم المنشئ (constructor) والمُدمر (destructor) من هذا الفصل. هذا تمرين كلاسيكي يحاكي كيفية عمل std::string داخلياً.

ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:

  • String.h: قم بتعريف فئة String الخاصة بك باتباع "قاعدة الخمسة" (Rule of Five). يجب أن تدير فئتك مؤشر char* يسمى data وعضواً من نوع size_t length. قم بتنفيذ ما يلي:
    • منشئ افتراضي (default constructor) ينشئ سلسلة فارغة (تخصيص حرف واحد لعلامة النهاية الفارغة null terminator، وتعيين الطول إلى 0). اطبع "Default constructed"
    • منشئ بمعاملات (parameterized constructor) يأخذ const char* ويقوم بنسخ سلسلة C-string إلى ذاكرة مخصصة حديثاً. اطبع "Constructed: <text>"
    • منشئ نسخ (copy constructor) يقوم بعملية نسخ عميق (deep copy) لسلسلة String أخرى. اطبع "Copied: <text>"
    • منشئ نقل (move constructor) (موسوم بـ noexcept) ينقل الملكية. اطبع "Moved: <text>" باستخدام النص قبل إفراغ المصدر
    • مُدمر (destructor) يحرر الذاكرة بأمان (تحقق مما إذا كانت فارغة). اطبع "Destroyed: <text>" (اطبع "Destroyed: (empty)" إذا كانت البيانات null أو الطول 0)
    • دالة size() تعيد الطول
    • دالة c_str() تعيد مؤشر الأحرف (تعيد "" إذا كان null)
  • main.cpp: استعرض عمل جميع المنشئات معاً. اقرأ سلسلة نصية من الإدخال، ثم:
    • أنشئ String يسمى s1 باستخدام المنشئ الافتراضي
    • أنشئ String يسمى s2 بالنص المدخل
    • أنشئ String يسمى s3 عن طريق نسخ s2
    • أنشئ String يسمى s4 عن طريق النقل من s2
    • اطبع "--- Status ---"
    • لكل سلسلة (من s1 إلى s4)، اطبع "s<n>: \"<text>\" (length: <len>)"

استخدم قوائم التهيئة (initializer lists) في جميع المنشئات لضمان الكفاءة. بعد عملية النقل، يجب أن تكون s2 فارغة بطول 0، بينما تحتفظ s4 بالنص الأصلي. ستظهر رسائل المُدمر في النهاية تنظيف الكائنات الأربعة بترتيب عكسي لإنشائها.

قم بتضمين <cstring> من أجل strlen و strcpy، و <utility> من أجل std::move(). لا تنسَ حواجز الرأس (header guards) في ملف الرأس الخاص بك.

جرّب بنفسك

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

using namespace std;

int main() {
    string input;
    getline(cin, input);

    // TODO: أنشئ String s1 باستخدام default constructor

    // TODO: أنشئ String s2 بنص الإدخال

    // TODO: أنشئ String s3 عن طريق نسخ s2

    // TODO: أنشئ String s4 عن طريق النقل من s2 (استخدم std::move)

    // طباعة ترويسة الحالة
    cout << "--- Status ---" << endl;

    // TODO: اطبع الحالة لكل سلسلة نصية من s1 إلى s4
    // التنسيق: "s<n>: \"<text>\" (length: <len>)"

    return 0;
}

جميع دروس Object Oriented Programming