استخدام مؤثر النطاق في ++C

c

استخدام مؤثر النطاق

كيف أمكن للدالتين pop(), push() في الفئة المشتقة أن تستدعي الدوال المقابلة لها في الفئة الأساسية ؟ لقد استخدم لذلك مؤثر النطاق scope resolution علي الصورة :

Stack :: push(var);

Return stack :: pop();

ولولا استخدام هذا المؤثر لظن المترجم أن كل دالة تستدعي نفسها , وهو بالطبع ما لا يقبله فهذا المؤثر يمكنك من أن تحدد أي فئة تنتمي إليها الدالة المطلوبة .

تعديل برنامج الأبعاد الإنجليزية

التطبيق التالي أكثر تطورا في استخدام التوارث , سوف نعدل البرنامج الخاص بالأبعاد الإنجليزية لكي يتضمن الأبعاد السالبة مع الموجبة .

englen.cpp


 


// englen.cpp


// inheritance using English Distances


// UCS Laboratories


#include <iostream.h>


#include <conio.h>


 


class Distance                    // English Distance class


   {


   protected:                     // NOTE: can't be private


      int feet;


      float inches;


   public:


      Distance()                  // constructor (no args)


     { feet = 0; inches = 0.0; }


      Distance(int ft, float in)  // constructor (two args)


     { feet = ft; inches = in; }


      void getdist()              // get length from user


     {


     cout << "\nEnter feet: ";  cin >> feet;


     cout << "Enter inches: ";  cin >> inches;


     }


      void showdist()             // display distance


     { cout << feet << "\'-" << inches << '\"'; }


   };


 


enum posneg { pos, neg };  // for sign in DistSign


 


class DistSign : public Distance  // adds sign to Distance


   {


   private:


      posneg sign;                // sign is pos or neg


   public:


                      // constructor  (no args)


      DistSign() : Distance()     // call base constructor


     { sign = pos; }          // set the sign to +


 


                      // constructor (2 or 3 args)


      DistSign(int ft, float in, posneg sg=pos) :


              Distance(ft, in)    // call base constructor


     { sign = sg; }           // set the sign


 


      void getdist()              // get length from user


     {


     Distance::getdist();     // call base getdist()


     char ch;                 // get sign from user


     cout << "Enter sign (+ or -): ";  cin >> ch;


     sign = (ch=='+') ? pos : neg;


     }


 


      void showdist()             // display distance


     {


     cout << ( (sign==pos) ? "(+)" : "(-)" );  // show sign


     Distance::showdist();                     // ft and in


     }


   };


 


void main()


   {


   DistSign alpha;                  // no-arg constructor


   alpha.getdist();                 // get alpha from user


 


   DistSign beta(11, 6.25);         // 2-arg constructor


 


   DistSign gamma(100, 5.5, neg);   // 3-arg constructor


 


                     // display all distances


   cout << "\nalpha = ";  alpha.showdist();


   cout << "\nbeta = ";  beta.showdist();


   cout << "\ngamma = ";  gamma.showdist();


   getche();


   }




تضيف الفئة distsign إمكانية التعامل مع الأبعاد السالبة والموجبة , والفئة الأصلية كما هي عدا تحويل نوع البيانات من النوع الخاص إلي النوع المحمي , وهو أجزاء لم يكن من داع له , فالدالة المشتقة ليست بها حاجة للتعامل مع بيانات الدالة الأصلية , ولكنه الإجراء المحبذ كما أشرنا .



الدوال المنتمية للفئة المشتقة



للفئة المشتقة distsign بادئتان , يماثلان ما في الفئة الأصلية , واحدة بلا معامل والثانية ذات معاملين , أو ثلاثة . المعامل الثالث , وهو اختياري ذو قيمتين pos, neg , ووضعه المبدئي هو pos وتشكل البادئتان كائنات الفئة المشتقة بعدة طرق .



كلتا البادئتين تستدعي البادئة المقابلة لها في الفئة الأصلية , كي تحدد الأقدام والبوصات , ثم تضيف من عندها وظيفة ثالثة , هي الإشارة وهي موجبة بحكم الوضع المبدئي .



وقد تطلبت إضافة الإشارة تعديلا في كل دالة من دوال الفئة المشتقة , بالشكل الواضح في البرنامج .



وكما تري تقدم لغة السي ++ أكثر الوسائل كفاءة في الاستفادة من خاصية التوارث فما تريد استخدامه من الفئة الأصلية متاح لك ، سواء أكان بيانا , أم بادئة أم دالة منتمية . وقد لاحظت أننا لم نحتج بالمرة إلي تكرار أمر من الأوامر .

التسميات: