مراجعة - فئة String
جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 26 من 104.
التحدي
سهللنقم ببناء فئة 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)
- منشئ افتراضي (default constructor) ينشئ سلسلة فارغة (تخصيص حرف واحد لعلامة النهاية الفارغة null terminator، وتعيين الطول إلى 0). اطبع
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
1أساسيات الـ OOP
الملفات الخارجيةبناء وتجميع (Compilation) لغة C++ملفات الـ Header وملفات الـ Sourceالـ Namespaces والـ Scopeمقدمة في الـ OOP في C++الـ Classes مقابل الـ Objectsالمؤشر 'this'الـ Methods (الدوال الأعضاء)الـ Attributes (بيانات الأعضاء)أساسيات الـ Ctors والـ Dtorsمراجعة - آلة حاسبة بسيطة4خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticدوال الـ Getters والـ Settersدوال الأعضاء الثابتة (Const)الكلمة المفتاحية Mutableالدوال والمتغيرات الساكنة (Static)الدوال والفئات الصديقة (Friend)مراجعة - مدير الحساب البنكي7الوراثة
الوراثة الأساسيةمستويات الوصول في الوراثةترتيب استدعاء الـ Ctor والـ Dtorإعادة تعريف الدوال (Method Overriding)الدوال الافتراضية والـ VTableالوراثة المتعددةالوراثة الافتراضيةمراجعة - هيكلية الموظفين10نظرة عامة على STL
نظرة عامة وفلسفة STLحاويات STLالـ Iteratorsخوارزميات STLالـ Functors وتعبيرات Lambdaمراجعة - تكرار الكلمات13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factory و Abstract Factoryنمط Builderنمط Observerنمط Strategy2إدارة الذاكرة
ذاكرة Stack مقابل Heapالمؤشرات والمراجعالذاكرة الديناميكية (new/delete)المؤشرات الذكية في C++RAII في C++مراجعة - مدير المصفوفات الديناميكية5التغليف (Encapsulation)
محددات الوصول في C++محددات الوصول بشكل متعمقإخفاء المعلوماتStruct مقابل Classالأصناف المتداخلة والداخليةمراجعة - نظام سجلات الطلاب8تعدد الأشكال (Polymorphism)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالتحميل الزائد للدوال (Function Overloading)مراجعة الدوال الافتراضية (Virtual Functions)الدوال الافتراضية البحتة (Pure Virtual Functions)الأصناف المجردة (Abstract Classes)تصميم الواجهات (Interface) في C++التحويل الديناميكي (Dynamic Casting) و RTTIملخص - حاسبة الأشكال11مفاهيم OOP المتقدمة
التركيب مقابل الوراثةالـ Mixins عبر CRTPنمط Pimplمحو النوع (Type Erasure)أصناف Enum والأنواع القويةمعالجة الاستثناءات في OOPتسلسلات الاستثناءات المخصصة14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط قالب الطريقةنمط الحالةنمط التركيبRAII كنمط3المنشئات والموادم
المنشئ الافتراضيالمنشئ ذو المعاملاتمنشئ النسخمنشئ النقلقوائم تهيئة المنشئالمنشئات المفوضةتعمق في الموادمقاعدة الثلاثة / الخمسة / الصفرمراجعة - فئة String6تحميل العوامل (Operator Overloading)
مقدمة في تحميل العواملتحميل العوامل الحسابيةتحميل عوامل المقارنةعوامل Streamتحميل عامل التعيينتحميل العوامل [] و ()عوامل تحويل النوعمراجعة - Matrix Class9القوالب
قوالب الدوالقوالب الأصنافتخصيص القوالبالقوالب المتغيرةأساسيات SFINAE و Type Traitsمراجعة - الحاويات العامة