time1

درس القوالب Templates-الدرس الأول

7 ردود في هذا الموضوع

بسم الله الرحمن الرحيم

أقدم هذا الدرس المهم جدا في البرمجة الغرضية التوجه object - oriented programming سنتكلم عن القوالب templates .

القوالب هي طريقة اختصارية للتحميل الزائد وتوفر لنا الوقت والجهد من كتابة تحميل زائد لأي دالة .

قبل ان ندرس القوالب على البرمجة الغرضية التوجه OOP سنقوم بدراستها على الدوال (التوابع - الوظائف) Function لكي نوضح آليه عملها والفائدة المرجؤة من ذلك .

Chapter -1

للتصريح عن قالب معين نستخدم الكلمة class او نستخدم الكلمة typename

مثال:

template<class T>

أو :

template<typename T>

بهذه الطريقة نكون قد صرحنا عن قالب T يمثل نوعية النمط المستخدم لاحقا .

عند استخدام T كوسيط في أي دالة سيكون عبارة عن وسيط وهمي ! .

ويتسبب عدم كتابة الكلمة class او الكلمة typename قبل نمط كل وسيط وهمي ظمن قالب لدالة ما بحدوث خطأ قواعدي !! .

سنقوم الان بإنشاء دالة array تأخذ وسطين أحدهما مصفوفة والاخر عدد يمثل عدد عناصر المصفوفة , تقوم الدالة بطباعة العناصر كلا بصف مستقل .

#include<iostream>
using std::cout;
using std::endl;

template<class T>
void array(T *x,int a)
{
for(int i=0;i<a;i++)
cout<<x[i]<<endl;
}
main()
{
int x[]={1,2,3,4,5};
double y[]={1.5,2.5,1.9,1.4};
char z[]="Template";

array(x,(sizeof(x)/4));
array(y,(sizeof(y)/8));
array(z,sizeof(z));
return 0;
}

نلاحظ من خلال المثال السابق بأن المخرجات ستكون

1

2

3

4

5

1.5

2.5

1.9

1.4

T

e

m

p

l

a

t

e

هكذا نكون قد اوضحنا آلية عمل القوالب على الدوال , يتبقى لنا الان ان نعرف كيفية استخدامها على الصفوف .

Chapter -2

من خلال المثال التالي , سنقوم بتصميم صف (صنف,فئة)class سنسميه Ali سيحتوي على دالة print تأخذ وسيط وهمي (قالب) وتقوم بطباعته على حسب عدد المرات والتي يتم تحديدها عند اشتقاق غرض من الصف (اي عن طريق دالة البناء).

تقوم الدالة Sure بالتأكد من ان عملية الطباعة ماتزال مستمرة , أي انها تعيد قيمة bool من خلالها تساوي احد المعطيات(متغير خاص) بالمطعى الخاص بأخذ العدد المطلوب لتكرار عملية الطباعة والذي يتم اعطائة القيمة بواسطة تابع البناء .

#include<iostream>
using namespace std;
template <class T>
class Ali
{
public:
Ali(int=1);
bool print(T);
bool Sure()
{
return y==x;
}
private:
int x;
int y;
};
template<class T>
Ali<T>::Ali(int a):x(a),y(0){}

template<class T>
bool Ali<T>::print(T a)
{
if(!Sure())
{
cout<<a<<endl;
y++;
return true;
}
else
return false;
}

main()
{
Ali<int> i(3);
Ali<double> d(2);
Ali<char*> c(4);





while(i.print(15)){}
while(d.print(15.50)){}
while(c.print("Ali")){}


return 0;
}

ستكون المخرجات : تكرار العدد الصحيح 15 ثلاث مرات , ايضا تكرار العدد المضاعف 15.5 مرتين , ايضا تكرار كلمة Ali اربع مرات .

الدوال مع قالب الصف

Chapter -3

سنقوم الان باستخدام الصف السابق بكتابة برنامج جديد .

سنوضح من خلال هذا البرنامج كيفية عمل القوالب مع الدوال التي يكون احد وسطائها قالب صف.

يحتوي البرنامج على دالة fun تأخذ وسيطين الأول غرض من صف Ali والوسيط الثاني سيكون وسيط وهمي لنوع من البيانات .

#include<iostream>
using namespace std;
template <class T>
class Ali
{
public:
Ali(int=1);
bool print(T);
bool Sure()
{
return y==x;
}
private:
int x;
int y;
};
template<class T>
Ali<T>::Ali(int a):x(a),y(0){}

template<class T>
bool Ali<T>::print(T a)
{
if(!Sure())
{
cout<<a<<endl;
y++;
return true;
}
else
return false;
}
template<class T>
void fun(Ali<T> &m,T a)
{
while(m.print(a))
{}
}


main()
{
Ali<int> i(3);
Ali<double> d(2);
Ali<char*> c(4);






fun(i,15);
fun(d,15.50);
fun(c,"Ali");
return 0;
}

ستكون المخرجات ايضا :تكرار العدد الصحيح 15 ثلاث مرات , ايضا تكرار العدد المضاعف 15.5 مرتين , ايضا تكرار كلمة Ali اربع مرات .

Chapter -4

نقوم اولا بتعريف الصف class بأنه "قالب صف" والذي يسمى بالمكدس Stack بواسطة تعريف القالب , يقوم المترجم بواسطة نص برمجي غير ظاهر للمستخدم او المبرمج بتعريف النمط T على انه النمط المرفق عند اشتقاق الغرض مثلا int او double بالنسبة للدوال داخل الصف يتم تعريف الدوال التي تأخذ وسيط وهمي "قالب" خارج تعريف الصف وباستخدام العملية الثنائية :: مع اسم القالب الصف

Ali <T>

لكي نحدد مجال الرؤية لتعريف الدوال الخاصة بالمكدس .

في main نقوم باشتقاق الغرض من الصف Ali كما تعودنا ولكن يجب تحديد نوعية النمط للمكدس ليتم التعامل معه مستقبلاً .

بهذا اكون قد انهيت الدرس الأول .

اتمنى ان يكون قد حاز على رضاكم واستحسانكم .

تقبلوا تحياتي :)

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الله يعطيك العافيه أخوي ... جهد طيب و بانتظار المزيد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اشكرك على ردك استاذي الفاضل وقريبا الدرس الثاني .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مشكووووووووووووور أخوي على الدرس الرائع والمفيد جدا جدا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكـــــــــــــــــــــــــــــرا خيو وجزيت خيرا على هيك عمل جبار

دمت بخير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بااااااااااااارك الله فيك درس رائع بلا حدود ،،، بالتوفيق وإلى الأمام

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله وبركاته

في الفصل الثالث جربت الكود ونسخة كما هو لكن هنالك رسالة خطأ من الكومبايلر:Anjuta on Linux

/home/mih1406/Projects/Development/gtk-foobar/src/main.cc:53: error: no matching function for call to ‘fun(Ali<char*>&, const char [4])’

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .