التصريح عن مؤشرات الدوال
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 33 من 61.
حتى الآن، تعلّمنا محاكاة الوراثة باستخدام تضمين البُنى. لكن تعدد الأشكال الحقيقي، حيث تستجيب الكائنات المختلفة بشكل مختلف للاستدعاء نفسه، يتطلب شيئًا إضافيًا: مؤشرات الدوال.
مؤشر الدالة هو متغير يخزن عنوان دالة. وكما يحتفظ المؤشر العادي بعنوان البيانات، يحتفظ مؤشر الدالة بعنوان التعليمات البرمجية القابلة للتنفيذ.
قد تبدو الصياغة النحوية مخيفة في البداية. للإعلان عن مؤشر function، تحدد نوع return، ثم اسم pointer بين قوسين مع علامة النجمة، متبوعًا بأنواع parameters:
int (*operation)(int, int);يُصرّح هذا عن متغيّر يُسمّى operation يمكنه الإشارة إلى أي function تأخذ two int parameters وتُعيد قيمة من نوع int. الأقواس المحيطة بـ *operation بالغة الأهمية؛ فمن دونها، ستُصرّح عن function تُعيد مؤشّرًا.
لتعيين function إلى هذا pointer، استخدم ببساطة اسم function (من دون أقواس):
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
operation = add; // الآن operation يشير إلى addيعمل اسم function باعتباره عنوانها. يمكنك أيضًا استخدام &add بشكل صريح، لكن ذلك اختياري: كلا الشكلين متكافئان في C.
التحدي
سهللنتدرّب على إعلان مؤشرات function وإسناد functions إليها. ستنشئ نظامًا بسيطًا للعمليات الحسابية حيث يمكن لمؤشر function أن يحتفظ بدوال حسابية مختلفة.
اكتب برنامجًا يقوم بما يلي:
- يعرّف functions اثنتين:
multiply: taking معاملين من النوعintويعيد حاصل ضربهماsubtract: taking معاملين من النوعintويعيد ناتج طرح الثاني من الأول
- داخل
main، يعلن متغير مؤشر function يسمىoperationويمكنه الإشارة إلى functions taking معاملين من النوعintوreturning قيمة من النوعint - يقرأ three inputs: العدد الأول، والعدد الثاني، وشفرة العملية (1 من أجل multiply، و2 من أجل subtract)
- استنادًا إلى شفرة العملية، يعيّن function appropriate إلى مؤشر
operationالخاص بك - يطبع اسم العملية المعيّنة، ثم يطبع نتيجة استدعاء function عبر المؤشر
ستتلقى three inputs: العدد الأول، والعدد الثاني، وشفرة العملية (1 أو 2).
ينبغي أن تبدو مخرجاتك بهذا الشكل:
Operation: multiply
Result: 35حيث إن multiply هو اسم العملية (أو subtract إذا كانت الشفرة 2)، و35 هي نتيجة استدعاء function عبر المؤشر الخاص بك (في هذه الحالة، 5 × 7).
تذكّر: لإعلان مؤشر function، تحتاج إلى نوع return، واسم المؤشر بين قوسين مع علامة النجمة، وأنواع parameters. ولإسناد function، استخدم اسم function فقط من دون أقواس.
جرّب بنفسك
#include <stdio.h>
// TODO: عرّف الدالة multiply هنا
// TODO: عرّف الدالة subtract هنا
int main() {
int num1, num2, code;
// اقرأ الإدخال
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &code);
// TODO: صرّح عن مؤشر دالة يسمى 'operation' يمكنه أن يشير إلى
// دوال تأخذ معاملين من نوع int وتُرجع int
// TODO: بناءً على رمز العملية (1 لـ multiply، 2 لـ subtract)،
// عيّن الدالة المناسبة إلى مؤشر operation الخاص بك
// TODO: اطبع اسم العملية والنتيجة
// التنسيق:
// Operation: <name>
// Result: <result>
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري7مؤشرات الدوال
التصريح عن مؤشرات الدوالاستدعاء مؤشرات الدوالاستخدام Typedef لمؤشرات الدوالتمرير الدوال كوسطاءمراجعة: Calculator Dispatch2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت