الحصول على الرصيد
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 26 من 61.
التحدي
سهليكاد حسابك المصرفي أن يكتمل! لقد أنشأت القدرة على إنشاء الحسابات وإيداع الأموال وسحبها، لكن ما زال هناك جزء مهم مفقود. حاليًا، لا توجد طريقة أمام التعليمات البرمجية الخارجية للاطلاع على الرصيد الحالي. لنُصلح ذلك بإضافة دالة getter.
تُعد دالة getter الطريقة الصحيحة لإتاحة الوصول إلى البيانات المخفية في وحدة مغلّفة. بدلًا من جعل حقل balance عامًا (مما سيكسر التغليف)، فإنك توفر دالة للقراءة فقط تُرجع القيمة. ويحافظ ذلك على حماية البيانات، مع السماح بالوصول المنضبط إليها.
ستواصل العمل باستخدام ملفاتك الثلاثة:
account.h: أضف تصريح دالة جديدًا:get_balance. تأخذ هذه الدالةconst Account *(لأنها تقرأ البيانات فقط ولا تعدّلها مطلقًا) وتُرجع قيمة من النوعdoubleتمثل الرصيد الحالي. احتفظ بجميع تصريحاتك الحالية.account.c: نفّذ دالةget_balance. فهي تُرجع ببساطة حقل balance المخفي من account. لاحظ كيف يمكن لهذه الدالة الوصول إلى البيانات الداخلية لأنها معرّفة في الملف نفسه الذي يحتوي على struct: لا يزال بإمكان التعليمات البرمجية الخارجية عدم الاطلاع عليها مباشرة.main.c: يمكنك الآن أخيرًا رؤية ما يحدث داخل حساباتك! أنشئ account، ونفّذ بعض المعاملات، واستخدم getter الجديد لعرض الرصيد في كل خطوة.
ستتلقى أربع قيم إدخال: معرّف account (عدد صحيح)، ومبلغ الإيداع، ومبلغ السحب، ومبلغ الإيداع الثاني.
في ملفك الرئيسي، أنشئ account واطبع رصيده الأولي (يجب أن يكون 0.00). أودع المبلغ الأول واطبع الرصيد الجديد. اسحب المبلغ المحدد واطبع الرصيد مرة أخرى. وأخيرًا، نفّذ الإيداع الثاني واطبع الرصيد النهائي. ثم دمّر account.
اطبع الناتج بهذا التنسيق:
Account 1001 created
Balance: 0.00
Balance: 500.00
Balance: 200.00
Balance: 350.00
Account destroyedحيث إن 1001 هو معرّف account، وتعكس الأرصدة ما يلي: الرصيد الأولي (0.00)، بعد إيداع 500.00، بعد سحب 300.00، وبعد إيداع 150.00 إضافية. نسّق جميع قيم الرصيد باستخدام منزلتين عشريتين بواسطة %.2f.
بعد إضافة getter، توفر وحدة حسابك المصرفي الآن وصولًا كاملًا ومنضبطًا إلى بيانات account: يمكن للمستخدمين رؤية الرصيد، لكن لا يمكنهم تعديله إلا من خلال دالتي deposit وwithdraw اللتين تتحققان من صحة العمليات.
جرّب بنفسك
#include <stdio.h>
#include "account.h"
int main() {
int account_id;
scanf("%d", &account_id);
double deposit1;
scanf("%lf", &deposit1);
double withdraw_amount;
scanf("%lf", &withdraw_amount);
double deposit2;
scanf("%lf", &deposit2);
Account* account = create_account(account_id);
printf("Account %d created\n", account_id);
// TODO: اطبع الرصيد الأولي باستخدام get_balance
deposit(account, deposit1);
// TODO: اطبع الرصيد بعد الإيداع الأول
withdraw(account, withdraw_amount);
// TODO: اطبع الرصيد بعد السحب
deposit(account, deposit2);
// TODO: اطبع الرصيد بعد الإيداع الثاني
destroy_account(account);
printf("Account destroyed\n");
return 0;
}جميع دروس البرمجة كائنية التوجه
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت