فصل ملف class عن ملف main في لغة C++ - ProgrammerTech
Language:

Search

فصل ملف class عن ملف main في لغة C++

  • Share this:
فصل ملف class عن ملف main في لغة C++

فصل الكلاس عن ملف main في C++

فصل ملف class عن ملف main, نُريد فصل الكلاس الذي انشأناه في الدرس السابق و جميع ما يخص الكلاس في ملف آخر و نريد في الملف الرئيسي فقط الدالة main لكي يكون الكود أكثر وضوحاً و اكثر تقسيماً.

 

خطوات فصل الكلاس عن ملف main

منذ بداية الدورة عملنا على برنامج CodeBlocks نقوم بترك المشروع الذي انشأناه في الدرس السابق.

و نقوم بالضغط على كلمة File في أقصى يسار البرنامج من الشريط العلوي, ثم نختار New أي ملف جديد لأننا نريد فقط إضافة ملف إلى هذا المشروع ثم نختار Class.

إنشاء كلاس جديد في C++

 

ثم نقوم بكتابة إسم الكلاس كما هو في ملف Main, نحن لدينا الكلاس إسمه Student نقوم بكتابة إسمه كما موضح بالشكل.

إنشاء كلاس جديد مفصول عن الملف main

بعد ذلك نضغط على Create, سوف يُنتشئ لنا ملفين جديدات و هما Student.h و Student.cpp كما موضخ بالشكل.

فصل ملف الكلاس عن الملف الرئيسي

و بداخل الملفين الذي قمنا بإنشاءهم ستكون اكوادهم التلقائية هي

  • ملف Student.h
ملف الكلاس مفصول عن ملف main في c++
  • ملف Student.cpp
كيفية فصل الكلاس عن الملف الرئيسي main

 

في الدرس السابق قُلنا أن الجزء الأول من البرنامج يُسمى برأس الكلاس أو class header و هو ما سيتم وضعه في ملف Student.h.

سوف نقوم بقصه من كود الدرس السابق و لصقه في Student.h كما يلي.

#include <iostream>
using namespace std;
#ifndef STUDENT_H
#define STUDENT_H
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();
};
#endif // STUDENT_H

و في Student.cpp الذي يُسمى ملف العمل نقوم بحذف جميع أكواده الموجودة التلقائية.

نُلاحظ في بدايته يكون كلمة Student مكتوبة بين علامتي تنصيص المزدوجه "" و ليس علامات اكبر من و اصغر من <>.

و الفرق بينهم هي أن علامة التنصيص المزدوجة تعني أن هذا الملف موجود في المشروع.

أما include iomanip هي خاصة بالمكتبات التي يجب جلبها من الخارج و ليست ملفات مكتوبة في هذا الملف.

و في ملف Student.cpp نقوم بقص ما كان يوجد أسفل main في مثال الدرس السابق و لصقه بها كما يلي.

#include "Student.h"
    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;
    }

و ملف main سوف يتم به فقط كتابة القيم أي علامات الطلبة.

و لكي يتم تعريف الكلاس نكتب include "Student.h" في بدايته كما بالكود الآتي..

#include <iostream>
#include "Student.h"
using namespace std;
int main()
{
    Student saja("Saja", 100);
    saja.printStatus();
    Student data("Mohammad", 30);
    data.printStatus();
    return 0;
}

وعند تشغيل البرنامج السابق سنحصل على النتيجة الآتية

Name: Saja
Degree: 100
Success: yes
Name: Mohammad
Degree: 30
Success: no

تطبيق عملي 1

قم بإنشاء كلاس لمستطيل و خصائص المستطيل هي الطول و العرض من نوع float.

و يجب إنشاء دالتان الأولى تقوم بإرجاع مساحة المستطيل و مساحة المستطيل هي الطول ضرب العرض.

و الدالة الثانية تقوم بإرجاع محيط المستطيل و محيط المستطيل يساوي إثنان ضرب الطول + العرض.

و يجب علينا إنشاء دوال set و get و جميع المتغيرات تكون من نوع private.

و تقوم دالة set بالتأكد ما إن كانت القيمة المُدخَلة أقل أو تساوي 20 و أكبر من 0 لكلا الدالتين.

الكلاس لدينا سيكون إسمه Rectangle.

  • ملف main
#include <iostream>
#include "Rectangle.h"
using namespace std;
int main()
{
    Rectangle rect = Rectangle(3, 2);
    cout << "المستطيل طوله" << rect.getHeight() << endl;
    cout << "عرضه" << rect.getWidth() << endl;
    cout << "مساحته" << rect.area() << endl;
    cout << "محيطه" << rect.perimeter() << endl;
    return 0;
}

في هذا الملف فقط قمنا بإنشاء كائن rect مشتق من الكلاس Rectangle ووضعنا له القيم الطول 3 و عرضه 2.

ثم وضعنا أوامر الطباعة في البداية يقوم بطباعة طول المستطيل عن طريق إستدعاء الدالة getHeight عن طريق الكائن rect.

و يليه طباعة عرض المستطيل عن طريق إستدعاء getWidth.

و ثم قمنا بالطلب منه بطباعة مساحة هذا المستطيل عن طريق area و كما نعرف بأن مساحة المستطيل هي الطول ضرب العرض.

ثم طلبنا طباعة محيط هذا المستطيل عن طريق perimeter و محيطه هو حاصل جمع الطول و العرض مضروب في إثنان 2.

  • ملف Rectangle.h
#ifndef RECTANGLE_H
#define RECTANGLE_H
class Rectangle{
private:
    int height, width;
public:
    Rectangle(int, int);
    /Function
    int area();
    int perimeter();
    /Setters
    void setHeight(int);
    void setWidth(int);
    /Getters
    int getHeight();
    int getWidth();
};
#endif

لقد انشأنا كلاس بإسم Rectangle و به مُتغيران من نوع int و هم للإرتفاع height و العرض width.

ثم انشأنا الكونستركتور من نوع public و به وضعنا مُتغيرات الدوال و هي area للمساحة و perimeter للمحيط.

و دوال الـ Setters للإرتفاع setHeight و للعرض setWidth و نوعهم عددية int.

و دوال Getters هم للإرتفاع getHeight و للعرض setWidth ثم اغلقنا الكلاس.

  • ملف Rectangle.cpp
#include "Rectangle.h"
    /Function
Rectangle::Rectangle(int h, int w)
{
    setHeight(h);
    setWidth(w);
}
int Rectangle::area()
{
    return height * width;
}
int Rectangle::perimeter()
{
    return 2*(height + width);
}
    /Setters
    void Rectangle::setHeight(int h)
    {
        height = h;
    }
    void Rectangle::setWidth(int w)
    {
        width = w;
    }
    /Getters
    int Rectangle::getHeight()
    {
        return height;
    }
    int Rectangle::getWidth()
    {
        return width;
    }

هُنا قمنا بوضع الكونستركتور في البداية ووضعنا الدوال التي تنتمي للكلاس و قمنا بالوصول إليها عبر إضافة إسم الكلاس و بعده نقطتين::.

و قُمنا بتمرير setHeight عبر الحرف h و setWidth عبر الحرف w.

و أتينا إلى مُتغير المساحة ووضعنا له أن يقوم بإرجاع لنا الطول ضرب العرض.

و ثم أتينا لمتغير المحيط perimeter و طلبنا منه أن يقوم بإرجاع لنا ناتج جمع الطول و العرض مضروب بالرقم إثنان.

ثم عرَّفنا دوال Setters و Getters بأن تقوم setHeight بإرجاع h و setWidth تقوم بإرجاع w.

و أن getHeight تقوم بإرجاع height و getWidth تقوم بإرجاع width.

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

The rectangle is its length: 3
susceptible: 2
area: 6
surroundings: 10

نلاحظ من النتيجة السابقة أنه أعطانا المستطيل طوله 3 و عرضه 2 و مساحته 6 أي تعني الطول ضرب العرض و محيطه 10 و هو العرض زائد الطول ضرب 2.

تطبيق عملي 2

قُم بإنشاء كلاس User بحيث يتم السماح للمستخدم بإنشاء مستخدم جديد من خلال إدخال إسم المستخدم و كلمة السر و يقوم بتسجيل هذه البيانات في مصفوفة.

#include <iostream>
using namespace std;
class User
{
private:
    string username, password;
public:
    void setUsername(string u)
    {
        username = u;
    }
    void setPassword(string p)
    {
        password = p;
    }
    string getUsername()
    {
        return username;
    }
    string getPassword()
    {
        return password;
    }
};
int size = 0; /عدد المستخدمين
User users[100];    /مصفوفة بها 100 عنصر

int main()
{
    string username, password;
    while(true)
    {
        cout << "اسم المستخدم" << " ";
        cin >> username;
        cout << "كلمة المرور" << " ";
        cin >> password;
        User newUser;
        newUser.setUsername(username);
        newUser.setPassword(password);
        users[size++] = newUser;
        for(int i=0; i<size; i++)
        {
            cout << i << ". " << users[i].getUsername() << endl;
        }
    }
    return 0;
}

انشانا كلاس بإسم User و به مُتغيران من نوع نصي و هُم لليوزرنيم username و الباسورد password.

ثم قُمنا بإنشاء بعض الدوال العامة بـ Setters و هي setUsername تُمرر متغير نصي u و setPassword تُمرر متغير نصي p.

و دوال Getters بأن getUsername تقوم بإرجاع اليوزرنيم و setPassword تقوم بإرجاع الباسورد.

ثم كتبنا متغير إسمه size أي عدد المستخدمين يبدأ العد من 0.

و وضعنا بأن حجم هذه المصفوفة تتسع لـ 100 يوزر.

ثم دخلنا للدالة main و أنشأنا حلقة تكرارية for بداخل حلقة تكرارية while من أجل الطلب من المستخدم كل مرة بأن يضيف بيانات جديدة و يتم تسجيلها في المصفوفة.

و عند التشغيل لهذا البرنامج و تعبئته ببعض البيانات سيكون كما يلي.

نتيجة مثال فصل ملف الكلاس عن الملف الرئيسي

Muhammad Alush

Muhammad Alush

إسمي محمد تركي العلوش من سورية من ريف حلب الشرقي 1994, محب للتقنية و التعلم الذاتي, و جميع خبراتي تعلمتها ذاتياً, و اللغات البرمجية التي أتقنها هي html, css, javascript, php, c, python بالإضافة إلى حبي الكبير لمجال الشبكات.

موقعي programmer-tech.com