Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

C++طريقة إنشاء كلاس عام و إنشاء كائنات منه

في المثال التالي قمنا بتعريف كلاس إسمه Box و يملك نوع بيانات مجهول رمزنا له بالحرف T.
في هذا الكلاس قمنا بتعريف متغير إسمه x نوعه T.
ثم قمنا بتعريف دالة إسمها getX() تستخدم لجلب قيمة المتغير x, و دالة إسمها setX() تستخدم لتحديد قيمة المتغير x.

في الأخير قمنا بتجربة إنشاء كائنين من الكلاس Box على النحو التالي:

  • الكائن الأول حددنا فيه أن قيمة x ستكون من النوع int.
  • الكائن الثاني حددنا فيه أن قيمة x ستكون من النوع string.
main.cpp

مثال

#include <iostream>
using namespace std;
// و هو خاص بالكلاس الذي سنقوم بتعريفه بعده T هنا قمنا بتعريف نوع بيانات غير محدد قمنا بتسميته
// موضوع في الكلاس T سيتم تبديله بكل حرف Box عند إنشاء كائن من الكلاس T النوع الذي نحدده للحرف
template <typename T>
class Box
{
private:
T x;
public:
void set(T x)
{
this->x = x;
}
T get()
{
return x;
}
};
// main() هنا قمنا بتعريف الدالة
int main()
{
// int في الكلاس الأصلي سيتم تبديله بالنوع T مع تحديد أن الحرف intBox إسمه Box هنا قمنا بتعريف كائن من الكلاس
Box<int> intBox;
// أيضاً int و الذي أصبح نوعه x سيتم تخزين هذه القيمة في المتغير .int هنا قمنا بإدخال قيمة فيه نوعها
intBox.set(100);
// أيضاً int القيمة التي سترجع هنا يكون نوعها .x هنا قمنا بإرجاع القيمة التي تم تخزينها في المتغير
cout << "intBox contains: " << intBox.get() << endl;
// string في الكلاس الأصلي سيتم تبديله بالنوع T مع تحديد أن الحرف stringBox إسمه Box هنا قمنا بتعريف كائن من الكلاس
Box<string> stringBox;
// أيضاً string و الذي أصبح نوعه x سيتم تخزين هذه القيمة في المتغير .string هنا قمنا بإدخال قيمة فيه نوعها
stringBox.set("I can store string value");
// أيضاً string القيمة التي سترجع هنا يكون نوعها .x هنا قمنا بإرجاع القيمة التي تم تخزينها في المتغير
cout << "stringBox contains: " << stringBox.get();
return 0;
}
#include <iostream> using namespace std; // و هو خاص بالكلاس الذي سنقوم بتعريفه بعده T هنا قمنا بتعريف نوع بيانات غير محدد قمنا بتسميته // موضوع في الكلاس T سيتم تبديله بكل حرف Box عند إنشاء كائن من الكلاس T النوع الذي نحدده للحرف template <typename T> class Box { private: T x; public: void set(T x) { this->x = x; } T get() { return x; } }; // main() هنا قمنا بتعريف الدالة int main() { // int في الكلاس الأصلي سيتم تبديله بالنوع T مع تحديد أن الحرف intBox إسمه Box هنا قمنا بتعريف كائن من الكلاس Box<int> intBox; // أيضاً int و الذي أصبح نوعه x سيتم تخزين هذه القيمة في المتغير .int هنا قمنا بإدخال قيمة فيه نوعها intBox.set(100); // أيضاً int القيمة التي سترجع هنا يكون نوعها .x هنا قمنا بإرجاع القيمة التي تم تخزينها في المتغير cout << "intBox contains: " << intBox.get() << endl; // string في الكلاس الأصلي سيتم تبديله بالنوع T مع تحديد أن الحرف stringBox إسمه Box هنا قمنا بتعريف كائن من الكلاس Box<string> stringBox; // أيضاً string و الذي أصبح نوعه x سيتم تخزين هذه القيمة في المتغير .string هنا قمنا بإدخال قيمة فيه نوعها stringBox.set("I can store string value"); // أيضاً string القيمة التي سترجع هنا يكون نوعها .x هنا قمنا بإرجاع القيمة التي تم تخزينها في المتغير cout << "stringBox contains: " << stringBox.get(); return 0; }

سنحصل على النتيجة التالية عند التشغيل.

intBox contains: 100
stringBox contains: I can store string value
intBox contains: 100 stringBox contains: I can store string value

معلومة تقنية

نقوم بتعريف Generic Class عندما يكون عندنا عمليات في هذا الكلاس يمكن أن تطبق على أكثر من نوع.
عندها بدل إنشاء كلاس للتعامل مع كل نوع على حدا, نقوم بتعريف كلاس عام Generic Class و نحدد النوع الذي نريد التعامل معه أثناء إنشاء كائن من هذا الكلاس.


عند إنشاء كائن من Generic Class تكون مجبر على تحديد كل أنواع البيانات الغير محددة فيه أو سيظهر لك خطأ Missing template arguments.