تکین وب | آموزش برنامه نویسی
تکین وب | آموزش برنامه نویسی

پیاده سازی کامل یک کلاس در ++C

۱۷ مهر ۱۳۹۴

در بخش قبلی به معرفی  مفهوم شیء گرایی و کلاس در ++C  پرداختیم . در این بخش می خواهیم به بررسی پیاده سازی کامل آن در ویژوال استادیو بپردازیم .

برای اینکه بتوان یک کلاس را در ویژوال استادیو تعریف کرد باید  مراحل زیر را انجام دهید . به این صورت که باید علاوه بر فایل cpp. (که در بخش نگاه کلی بر ++c با ساختن آن آشنا شدیم )، فایل h. نیز ساخته شود .  این فایل مانند سایر فایل هایی که در بالای main ضمیمه می کردیم ، می باشد . با این تفاوت که خود برنامه نویس آن را طراحی کرده است و می تواند از آن را در برنامه اش استفاده کند . برای مثال فرض کنیم می خواهیم کلاسی تحت عنوان کلاس date یا تاریخ را پیاده سازی کنیم . به این صورت که برنامه با وارد کردن تاریخ روزی که کاربر در آن قرار دارد ، درستی و نادرستی تاریخ وارد شده را بررسی می کند و آن را گزارش می دهد .

فایل های Date.h و Date.cpp

بعد از ساخت یک پروژه جدید و فایل cpp. ، در قسمت Solution Explorer ، در قسمت Header Files ، کلیک راست کرده و به Add –>New item ، وارد شوید :

 

class

با این کار وارد صفحه ی جدیدی خواهید شد که در این قسمت باید فایل h. را بسازید . به این صورت که با انتخاب (Header File(.h و انتخاب یک نام دلخواه برای فایل هدر خود ، گزینه Add را در پایان انتخاب کنید . در این فایل می خواهیم همه ی اطلاعات کلاس خود را قرار دهیم . یا به طوری کلی بلاک کلاس در این فایل تعریف خواهد شد :

 

class

علاوه بر این باید فایل دیگری بسازیم که بتوان توابع داخل کلاس date را در آن پیاده سازی کرد . به همین منظور یک فایل cpp. نیز بسازید . مثلا در date.cpp :

class

حال به پیاده سازی بدنه main ، بلاک کلاس و توابع عضو کلاس date می پردازیم :

در آغاز کار به طراحی کلاس date  در فایل date.h می پردازیم . همانطور که می دانید ، کلاس مانند نقشه ای است که از روی آن شیء های مورد نظر ساخته می شوند .

#ifndef DATE_H
#define DATE_H
class date
{
private:
int year,month,day ;
public:
date(int y , int m , int d);
date();
};
#endif

در کد بالا کلاس date همراه با متغیرهای private و سازنده یا constructor در قسمت public تعریف شده اند . اگر به خاطر داشته باشید گفتیم که متغیرهایی که در قسمت privateتعریف می شوند ، نمی توانند در آن جا مقدار دهی اولیه شوند . بنابراین باید جایی وجود داشته باشد که این متغیرها  مقدار دهی اولیه شوند . این امکان در constructor وجود دارد . یعنی می توان آنها را در تابع سازنده مقداردهی کرد . بنابراین به قسمت date.cpp رجوع کرده و توابع عضو کلاس date را در این قسمت پیاده سازی می کنیم . علاوه بر این یک کلاس می تواند سازنده های مختلفی  داشته باشد . این سازنده ها هم نام کلاس اند اما در تعداد آرگومان های ورودی ، با هم متفاوت اند . مثلا در کلاس بالا دو سازنده تعریف شده اند که یکی دارای سه متغیر به عنوان پارامتر ورودی است و دیگری پارامتر ورودی ندارد . توجه کنید که نمی توان دو سازنده با امضای(نام و  تعداد پارامترهای ورودی) یکسان در یک کلاس وجود داشته باشند .

وقتی سرفایلی را include می کنید محتویات آن به فایلی که در آن include شده اضافه می شود. حالا اگر این سرفایل چند بار اضافه شود پس تعاریف هم چند بار اضافه شده اند و کامپایلر خطا می دهد. پس باید کاری کنیم تا اگر سرفایل بیش از یکبار include شد محتویات آن دوباره اضافه نشوند. اگر دقت کنید در بالای این کلاس دو  دستور ifndef  DATE_H# و define DATE_H# و در پایان آن دستور endif# قرار گرفته است . دستور ifndef# مخفف if not defined و دستور ifdef# مخفف if definedمی باشد . ifndef DATE_H# چک می کند که اگر DATE_H تعریف نشده است ، دستورات بعد از آن تا endif#  درنظر گرفته شوند . بعد از ifndef DATE_H#  دستور define# هم آمده است که اگر DATE_H تعریف نشده باشد این دستور هم در نظر گرفته خواهد شد. بنابراین در اولین include کردن این سرفایل ، DATE_H تعریف و محتویات سرفایل در نظر گرفته می شود. اما اگر این سرفایل در محلی دوباره include شود (جایی که قبلاً include شده) دستورات بین ifndef# و endif# در نظر گرفته نخواهند شد؛ درست مانند اینکه اصلاً دوباره include نشده است.برای سرفایل ها معمولاً نام آنها  را با H_ بعد از آن در نظر گرفته می شود (که حتی الامکان تداخلی با بقیه ثابت های تعریف شده نداشته باشد). در اصل نام سرفایل ، date.h می باشد  ، به همین خاطر ما نام ثابت را DATE_H در نظر گرفتیم .

نکته ای که وجود دارد این است که شما باید برای اینکه به کامپایلر بفمانید که می خواهید از اعضای کلاس date استفاده کنید ،باید  فایل date.h را در بالای فایل date.cpp ضمیمه کنید یعنی :

#include "date.h"

حالا می توانیم بدنه ی constructor یا سازنده را در این قسمت پیاده سازی کنیم :

#include"date.h"

date::date()
{
year = 0 ;
month = 0 ;
day = 0 ;
}

همچنین می توان سازنده ای با سه پارامتر ورودی را به صورت زیر پیاده سازی نمود :

#include"date.h"

date::date(int a , int b . int c)
{
year = a;
month = b ;
day = c ;
}

اما مسئله ای که وجود دارد این است که اگر کاربر سال یا ماه یا روزی را وارد کرد که غیر مجاز بود ، در اینصورت برنامه باید چگونه عمل کند ؟ مثلا اگر کاربر روزی با مقدار ۳۴ را وارد کرد ، در این صورت برنامه باید آن قدر قابلیت بالایی داشته باشد که مقادیر غیرمجاز را شناسایی کرده و گزارش کند و به محاسبه نپردازد ! و یا اینکه از کاربر بخواهد تا مقدار مجازی را وارد نماید .

بنابراین باید کنترل مقادیر در توابعی انجام شوند . البته شما می توانید این کنترل ها را در خود سازنده انجام دهید اما بهتر است برای این کار از توابع معروفی به نام توابع set و get استفاده نمایید . این توابع معمولا در قسمت public تعریف می شوند . دراینصورت می توان از آنها در main استفاده نمود .

 پیاده سازی توابع set و get

باید بگوییم که پیاده سازی این توابع دلخواه است و آنچه در این قسمت گفته می شود ، آن چیزی است که معمولا انجام می دهند .

توابع set توابعی هستند که اطلاعاتی را از بیرون از کلاس به داخل کلاس انتقال می دهند . این توابع معمولا نوع بازگشتی void دارند و دارای آرگومان ورودی برای انتقال اطلاعات می باشند . اما توابع get توابعی هستند که اطلاعات داخل کلاس را به بیرون از main انتقال می دهند . بنابراین دارای نوع بازگشتی اند و هیچ گونه پارامتر ورودی ای ندارند .

برای کلاس date باید روز و ماه وسال توسط کاربر در main وارد کلاس شوند و بعد از انجام عملیاتی به عنوان نتیجه به بیرون از کلاس و در main به عنوان خروجی تحویل داده شوند . برای هر کدام از متغیرهای روز و ماه و سال باید این توابع لحاظ شوند . بنابراین در قسمت public و در فایل date.h این توابع را تعریف می کنیم :

#ifndef DATE_H
#define DATE_H
class date
{
private:
int year , month , day ;
public:
date(int a , int b , int c);
void set_year(int a);
void set_month(int b);
void set_day(int b ,int c);
int get_year();
int get_month();
int get_day();
};
#endif

 در اینجا به پیاده سازی یک تابع از set ها و یک تابع از getها می پردازیم . پیاده سازی های دیگر این توابع را می توانید در سورس برنامه از آخر این بخش دانلود نمایید .

پیاده سازی این توابع همانند تابع سازنده باید در فایل date.cpp قرار گیرد .

void date::set_year(int a)
{
if(a>=0 && a<=1394 )
year = a ;
else
{
cout<<"invalid year!!"<<endl;
year = 0;
}
}

 در کد بالا سال وارد شده کنترل می شود و درصورت نادرست بودن آن پیغام خطا داده شده و مقدار ۰ در متغیر year قرارخواهد گرفت .

int date::get_year()
{
return year ;
}

کد بالا هم مقدار ذخیره شده در year را برمی گرداند .

اما نکته ای که وجود دارد این است می توان توابع set را در constructor فراخوانی کرد . در این صورت متغیرهای وارد شده کنترل می شوند .

date::date(int a , int b , int c)
{
set_year(a);
set_month(b);
set_day(b,c);
}

حال بعد از نوشتن و کامل کردن بلاک کلاس و توابع عضو آن به پیاده سازی main می پردازیم :

#include"iostream"
#include"date.h"
#include<stdlib.h>
using namespace std;
int main()
{
int y , m , d;
cout<<"Enter the date included year , mounth & day :"<<endl;
cin>>y>>m>>d;
date d1(y , m , d);
cout<<"Date is : "<<d1.get_year()<<"/"<<d1.get_month()<<"/"<<d1.get_day()<<endl;
system("pause");
}

برای اینکه بتوان از کلاس و ویژگی های آن در فایل main.cpp استفاده کنیم ، لازم است کلاس را در بالای main ضمیمه کنیم .

بعد از این کار و ضمیمه کردن فایل های کتابخانه ای دیگر ، برای قرار دادن تاریخ که از سال و ماه و روز تشکیل می شود ، لازم است سه متغیر از نوع int تعریف کنیم .

با ساختن یک شیء به نام d1 که دارای ۳ پارامتر ورودی است ، سازنده کلاس  صدا زده می شود . دراینصورت y و m و d در ورودی های سازنده کپی خواهند شد . یعنی y به جای a و m به جای b و d به جای c قرار می گیرد . بنابراین کنترل برنامه به داخل کلاس date هدایت می شود . با کپی شدن این متغیرها به جای ورودی های سازنده ، توابع set مربوط به هر کدام صدا زده می شود . در اینصورت بررسی می کند که آیا مقدار وارد شده توسط کاربر ، مجاز است یا خیر .

بعد از بررسی ورودی ها ، با صدا زدن هر تابع get می توانیم از صحت یا عدم صحت ورودی ها اطمینان پیدا کنیم . برای مثال  ()d1.get_year  ، درستی یا نادرستی ورودی را برمی گرداند .

شما می توانید علاوه بر این توابع ، توابع دیگری را نیز پیاده سازی کنید . مثلا تابعی برای تشخیص کبیسه بودن یا نبودن سال ورودی یا تابعی برای محاسبه روزهای گذشته از ابتدای سال تا تاریخی که کاربر وارد کرده است و …. .

به این ترتیب شما می توانید با ضمیمه کردن این کلاس در هر main دیگری از آن استفاده کنید . این برنامه تنها یک برنامه ساده جهت آشنایی با کلاس و پیاده سازی آن در ویژوال استادیو می باشد . درآینده برنامه هایی با قایلیت های بیشتر  را پیاده سازی خواهیم کرد .

دانلود سورس برنامه : DateClass

در ضمن اگر اینستاگرامی هستید حتما @Takinweb را فالو کنید…

درباره ی عطیه رحمانی

دیدگاه ها

4 دیدگاه ارسال شده !

  1. AmirHossein می‌گه:

    خیلی ممنون این مطلب واقعا مورد استفاده من واقع شد و خیلی بهم کمک کرد.

  2. f r می‌گه:

    تشکر بابت زحماتتون لطفا اگه میشه اموزش کاملا کامل فایل در c++ رو هم بزارید با امید سلامتی و موفقیت برای شما

  3. بهار می‌گه:

    ممنونم خیلی عالی توضیح داده شده بود و منو از سردرگمی در آورد.خدا پشت و پناهتون

دیدگاه خود را به ما بگویید.

کلیه ی حقوق مادی و معنوی مطالب متعلق به سایت تکین وب می باشد و کپی برداری و بازنشر آن بدون ذکر منبع کاری غیر حرفه ای و غیر اخلاقی و قابل پیگرد قانونی خواهد بود.
کانال تلگرام تکین وب