مراجعة - مدير الحساب البنكي
جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 33 من 104.
التحدي
سهللنبنِ مديرًا كاملًا للحسابات المصرفية يجمع كل مفاهيم خصائص class التي تعلمتها في هذا الفصل: الأعضاء private مع getters وsetters، ودوال الأعضاء const، والأعضاء mutable، والمتغيرات والأساليب static، والدوال friend.
ستُنشئ ملفين لتنظيم الشيفرة:
BankAccount.h: عرّف class باسمBankAccountيدير بيانات الحساب مع التغليف المناسب. ينبغي أن يتضمن class ما يلي:- أعضاء private:
accountNumber(سلسلة نصية)،ownerName(سلسلة نصية)،balance(عدد عشري)، وmutable int queryCountلتتبع عدد مرات التحقق من الرصيد - عضو static خاص هو
totalAccountsلتتبع عدد الحسابات الموجودة - constructor يأخذ رقم الحساب واسم المالك والرصيد الابتدائي. ينبغي أن يهيّئ
queryCountإلى0ويزيدtotalAccounts - دوال getters من النوع const:
getAccountNumber()وgetOwnerName()وgetBalance(): ينبغي أن يزيد getter الخاص بالرصيدqueryCountفي كل مرة يتم استدعاؤه فيها - دالة getter من النوع const هي
getQueryCount()تُعيد عدد مرات التحقق من الرصيد - دالة
deposit(double amount)تضيف إلى الرصيد فقط إذا كانت القيمة موجبة - دالة
withdraw(double amount)تطرح من الرصيد فقط إذا كانت القيمة موجبة ولا تتجاوز الرصيد الحالي - دالة static هي
getTotalAccounts()تُعيد العدد الإجمالي للحسابات التي أُنشئت - Declare دالة friend هي
transfer(BankAccount& from, BankAccount& to, double amount)تنقل الأموال بين الحسابات. ينبغي ألا تُجري النقل إلا إذا كانت القيمة موجبة وكان لدى المصدر funds كافية
عرّف العضو static والدالة friend بعد تعريف class.
- أعضاء private:
main.cpp: اعرض عمل جميع هذه الميزات معًا. اقرأ اسمَي مالكين ورصيدين ابتدائيين من الإدخال (أربعة أسطر إجمالًا: name1 وbalance1 وname2 وbalance2)، ثم:- أنشئ كائنين من
BankAccountبأرقامَي الحساب"ACC001"و"ACC002" - اطبع
"Total accounts: <count>" - اطبع
"<name>: $<balance>"للحساب الأول - اطبع
"<name>: $<balance>"للحساب الثاني - أودع
500.0في الحساب الأول - اطبع
"After deposit - <name>: $<balance>"للحساب الأول - حوّل
300.0من الحساب الأول إلى الحساب الثاني باستخدام الدالة friend - اطبع
"After transfer:" - اطبع
" <name>: $<balance>"للحساب الأول - اطبع
" <name>: $<balance>"للحساب الثاني - اطبع
"Query count for <name>: <count>"للحساب الأول
- أنشئ كائنين من
نسّق جميع قيم الرصيد باستخدام منزلتين عشريتين عبر std::fixed وstd::setprecision(2) من <iomanip>. حوّل مدخلات الرصيد من سلاسل نصية إلى أعداد عشرية باستخدام std::stod().
لا تنسَ حواجز التضمين في ملف الترويسة، وأن تضمّن <string> و<iostream> حيثما يلزم.
جرّب بنفسك
#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"
int main() {
// قراءة المدخلات
std::string name1, name2;
std::string balance1Str, balance2Str;
std::getline(std::cin, name1);
std::getline(std::cin, balance1Str);
std::getline(std::cin, name2);
std::getline(std::cin, balance2Str);
double balance1 = std::stod(balance1Str);
double balance2 = std::stod(balance2Str);
// تعيين تنسيق الإخراج لمنزلتين عشريتين
std::cout << std::fixed << std::setprecision(2);
// TODO: أنشئ كائنين من BankAccount بأرقام الحسابات "ACC001" و "ACC002"
// TODO: Print "Total accounts: <count>"
// TODO: اطبع "<name>: $<balance>" للحساب الأول
// TODO: اطبع "<name>: $<balance>" للحساب الثاني
// TODO: أودع 500.0 في الحساب الأول
// TODO: Print "After deposit - <name>: $<balance>" for the first account
// TODO: حوّل 300.0 من الحساب الأول إلى الثاني باستخدام friend function
// TODO: Print "After transfer:"
// TODO: اطبع " <name>: $<balance>" للحساب الأول (لاحظ المسافة البادئة بمسافتين)
// TODO: اطبع " <name>: $<balance>" للحساب الثاني (لاحظ المسافة البادئة بمسافتين)
// TODO: Print "Query count for <name>: <count>" for the first account
return 0;
}
جميع دروس البرمجة كائنية التوجه
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مراجعة - الحاويات العامةتدرّب بنفسك: مترجم C++ عبر الإنترنت