تعريف الدوال خارج الكلاس في لغة سي بلس بلس C++ الدرس |28| - Programmer Tech

Programmer Tech

تعلم البرمجة - علوم الكمبيوتر - أمن المعلومات - القرصنة الأخلاقية

إعلان اعلى المقالة

الاثنين، 22 مارس 2021

تعريف الدوال خارج الكلاس في لغة سي بلس بلس C++ الدرس |28|

 

تعريف الدوال خارج الكلاس

سنتعلم اليوم في هذا الدرس اكثر عن إستعمالات الكلاس, اولاً سوف نتعلم عن كيفية كتابة الدوال الخاصة بالكلاس خارج الكلاس.

مثال

#include <iostream>
using namespace std;
class Student{
private:
    string name;
    double grade;

public:
    Student(string n, double g)
    {
        setName(n);
        setGrade(g);
    }
    void setName(string n)
    {
        name = n;
    }
    void setGrade(int g)
    {
        grade = g;
    }
    string pass()
    {
        return (grade > 60 ? "yes" : "no");
    }
    void printStatus()
    {
        cout << "Name : " << name << endl;
        cout << "Degree : " << grade << endl;
        cout << "Success : " << pass() << endl;
        cout << endl;
    }
};
int main()
{
    Student saja("Saja", 100);
    saja.printStatus();
    Student data("Mohammad", 30);
    data.printStatus();

    return 0;
}

 

شرح المثال السابق 1

لقد قمنا بتعريف كلاس إسمه Student و كان به خاصيتان و هما name أي الإسم و نوعه نصي string و grade أي الدرجة نوعه double و كما تعلمنا مسبقاً أن جميع الخواص او المتغيرات يتم تعريفها كـ private كي لا يتم الوصول إليها و التعديل على قيمها مباشرتاً من قبل الدوال خارج كلاس Student مثل دالة main, ثم في public نضع جميع الـ function ( جميع الدوال ) و من ضمن هذه الدوال الأولى هي دالة البناء الكونستركتور و قمنا بإعادة تعريف دالة البناء الكونستركتور Student بإضافه معاملين المعامل الأول n و المعامل الثاني g كي نقوم بتغير name من خلال إستدعاء دالة setName و هي طريقة افضل لكتابة الكونستركتور أن نقوم بإستعمال setName بدلاً من كتابة name=n و ايضاً قُمنا بكتابة setGrade فسيتم تعريف name في n و الـ Grade في g و هما دالتان من نوع void و كما قُلنا أن Setters من نوع void و يتم تمرير معامل من نفس نوع المتغير name, و المتغير name نوعه string فسيتم تمرير string n و يتم تعيين name بهذا المعامل و ايضاً setGrade بنفس الطريقة, ثم انشأنا دالة تسمى pass و هي تقوم بإرجاع string تقوم هذه الدالة بالتأكد ما إن كان Grade اكبر من 60 سيقوم بطباعة نعم أي ناجح, و غير ذلك سوف يقوم بطباعة لا أي راسب, و دالة printStatus هذه الدالة سوف تقوم بطباعة الإسم و الدرجة و الحالة ما إن كان ناجحاً ام لا فسيتم طباعة النجاح من الدالة pass و في الدالة main قُمنا بتعريف كائن إسمه saja و كان هذا الكائن يُمرر قيمة Saja كإسم و 100 كدرجة ثم سيتم طباعة الحالة عن طريق الكائن, ثم انشانا كائن data و كان يمرر Mohammad كإسم و 30 كدرجة ثم يقوم بطباعة الحالة له.


نُلاحظ أنه عند دالة الطباعة cout لم نكتب Get لأننا لم نقُم بالحاجة إلى إستدعاء Grade لأي من الكائنات, لنَقُم بإعادة ترتيب الكود السابق, تحدثنا في دروس سابقة عن طريقة كانت بأن نقوم بكتابة رأس الدالة فقط مثلاً

void printName()
{
هنا نقوم بكتابة الكود
}

و نقوم بنسخ الكود و لصقه أسفل main, فهل يمكننا فعل ذلك بدوال الكلاس؟

سوف نُلاحظ أن دوال الكلاس كبيرة بعض الشيئ و قد يكون في بعض الكلاسات دوال كثيرة و كبيرة ايضاً, هل يمكننا اختصار ذلك؟ نعم يُمكننا بكل بساطة سوف نقوم بنسخ جميع الدوال الذي في public في المثال السابق و لصقها خارج الـ main حيث أن main غير معرًّفة خارجها لأن هذا النطاق خارج جميع الدوال و خارج الكلاس ايضاً, لكن نحن نُريد تحديد مثلاً دالة setName تنتمي إلى الكلاس Student بكل بساطة يمكننا كتابة

Student::Student(string n, double g)

بهذه الطريقة يُمكننا الوصول إلى الدوال التي قُمنا بتعريفها, و نقوم في الأعلى بإلغاء جميع اجسام الدوال و نقوم فقط بإبقاء رؤوس الدوال بإضافة لفاصله المنقوطة, كما كنا نفعل سابقاً اعلى main فهذا يسمى function prototype أي راس الدوال بحيث فقط نقوم بإبقاء رؤوس العناوين لبعض الدوال و خارج الكلاس نقوم بتعريف هذه الدوال لذلك يجب كتابة Student نقطتين فوق بعض أي سوف نقوم بإكمال بعض الدوال الخاصة بالكلاس Student و سيسمح لنا بكتابة إسم الدالة, سيكون الكود بالشكل

#include <iostream>
#include <iomanip>
using namespace std;
class Student{
private:
    string name;
    double grade;
public:
    Student(string n, double g);
    void setName(string n);
    void setGrade(int g);
    string pass();
    void printStatus();
};
int main()
{
    Student saja("Saja", 100);
    saja.printStatus();
    Student data("Mohammad", 30);
    data.printStatus();
    return 0;
}
    Student::Student(string n, double g)
    {
        setName(n);
        setGrade(g);
    }
    void Student::setName(string n)
    {
        name = n;
    }
    void Student::setGrade(int g)
    {
        grade = g;
    }
    string Student::pass()
    {
        return (grade > 60 ? "yes" : "no");
    }
    void Student::printStatus()
    {
        cout << "Name : " << name << endl;
        cout << "Degree : " << grade << endl;
        cout << "Success : " << pass() << endl;
        cout << endl;
    }

عند تشغيل هذا الكود سنحصل على النتيجة


خلاصة الدرس

تعلمنا في هذا الدرس كيفية فصل بعض الدوال من تصميم الكلاس إلى خارج الكلاس بحيث نقوم بإكمال تعريف الدوال خارج الكلاس و في الحقيقة هذه الطريقة الأمثل لتصميم الكلاس و يسمى الجزء الأول من البرنامج برأس الكلاس أو class header, فقط نقوم بتعريف المُتغيرات و الدوال الموجودة و لا نقوم بكتابة أي كود بداخل الدالة فقط نقوم بتعريف مُتغيرات و تعريف دوال و لا نقوم بكتابة كود او تعليمات برمجية سيتم تشغيلها, فقط تعريف.

ليست هناك تعليقات:

إرسال تعليق

facebook

نموذج الاتصال

الاسم

بريد إلكتروني *

رسالة *