االسلام عليكم
فيه نقاط بسيطه مبهمه مثــل
وش معنى هالسطر .. "
#define maxsize 100
وأيش معنىا هذا ؟
Stack::~Stack()
{
}مع انـه عرفناهـ بـ الكلاس
بس ليش عرفناه وليش سويناه بالاصـل ؟
وعرفناه هيـك بـ public
virtual ~Stack();
واكون لكم من الشاكرين
االسلام عليكم
فيه نقاط بسيطه مبهمه مثــل
وش معنى هالسطر .. "
#define maxsize 100
وأيش معنىا هذا ؟
Stack::~Stack()
{
}مع انـه عرفناهـ بـ الكلاس
بس ليش عرفناه وليش سويناه بالاصـل ؟
وعرفناه هيـك بـ public
virtual ~Stack();
واكون لكم من الشاكرين
Stack::~Stack(){}هو عبارة عن Destructors
و هو عبارة عن دالة تكون بنفس اسم الفئة و تكون مسبوقة بهذة العلامة"~"
و لا يكون لها return type و لا تقوم بارجاع اى قيمة و لا تأخذ اى arguments و يستخدم لتنظيف الذاكرة
حيث يتم فيه مسح القيم الموجودة داخل ال data التى قمت بتعريفها private فى الفئة خاصتك
و لاحظ ايضا هذة الجملة
the compiler uses the destructor to destroy an object of the destructor's class type
و ان لم تقم بعمل Destructors فى الفئة خاصتك سيقوم الكومبايلر بعمل Destructors


معليش يا اسراء ياليت شرح اكثر توضيح لاني مبتدئ .. .
وياليت تشرحين لي هالنقطه كمان
#define maxsize 100
يعطيكي الف عافيه
mr.4one كتب:#define maxsize 100
أنت تعطي للعبارة maxsize قيمة مساوية لـ 100 (انتبه :excl: هذا ليس تصريح عن متحول)
الآن في أي مكان في برنامجك تكتب فيه maxsize عندما تطلب بناء البرنامج سيقوم الكومبايلر باستبدال هذه العبارة بالقيمة 100.
أي أن:
for (i=0; i <= maxsize; i++){ ... }تماثل تماماً
for (i=0; i<= 100; i++){ ... }والغرض من التصريح عنها جعل البرنامج أكثر قابلية للقراءة وفهم للقيم.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
طيب يآخي عرفت انه تعريــف .. بس ماذا تقصــد بـ (انتبه هذا ليس تصريح عن متحول) .. كيف يعني تصريح عن متحول ..؟
طيب ياليت تذكر لي استخدام اخر لـ #define
او طريقه استخدامه .. بشكل عام ..
وثآني شي ..:
ياليت تشرح .. بشكل تفصيلي .. عن
Stack::~Stack()
{
}مع انـه عرفناهـ بـ الكلاس
بس ليش عرفناه وليش سويناه بالاصـل ؟
وعرفناه هيـك بـ public
virtual ~Stack();
اقتباسمعليش يا اسراء ياليت شرح اكثر توضيح لاني مبتدئ ..
حاضر هحاول
عندما تكتب الفئة خاصتك من الممكن ان تحتوى على بعض الدوال التى تقوم ببعض المهام التى تريدها انت
توجد دالة يتعرف عليها الكومبايلر اثناء تنفيذ البرنامج و ليس ككل الدوال لذا فهى دالة خاصة special
تسمى Destructors
اى عندما تقوم بعمل دالة بنفس اسم ال class و تكون مسبوقة بهذة العلامةّّ ~ يتعرف عليها الكومبايلر كـ Destructors
ما هى مهمتة :::
حيث يتم فيه مسح القيم الموجودة داخل ال data التى قمت بتعريفها private فى الفئة خاصتك
و لاحظ ايضا هذة الجملة
the compiler uses the destructor to destroy an object of the destructor's class type
اثناء تشغيل البرنامج انت تضع قيم للـ data الموجودة فى الفئة او تأخذ كائن منها فى نهاية البرنامج يقوم الـDestructors
بمسح هذة القيم
و ان لم تقم بعمل Destructors فى الفئة خاصتك سيقوم الكومبايلر بعمل Destructors
اى انك لم تكتب هذا السطر من الكود
Stack::~Stack(){}سيقوم البرنامج بكتابته هو و تنفيذه
اى استفسار
تم تعديل هذه المشاركة بواسطة اسراء شلبى في 2 يونيو 2010 في 12:29


طيب .. اختي كيف يتم استدعائه هالداله .. عشان يحذف البيانات .. !!
Stack::~Stack(){}او انه اوتوماتيكي يستدعي نفسه عند نهايه البرنامج ؟ ..
وطيب قصدك انه المفروض ماكتبــه . .!! لانه اوتوماتيكي المترجم يعمل الحذف ..؟
طيب الي فهمتــه ..
ان مثـلا لو عملنا stack
وداخل الـ main()
كتبها مثـلن
stack s(5);
يعني التخزين يتــم بـ s بـ الـ main() وليس داخل الـ كلاس .. ؟ هل يحذفه ام لا ..
واشكرك ع اجابتك
طيب هذا مثال بسيط .. طيب هل يتم حذف الـ s واذا كان يتم الحذف البيانات .. ليــه ؟ مع اني حجزتها داخل الـ main
Stack::~Stack()
{
}
void main()
{
Stack s(5);
}اقتباسطيب يآخي عرفت انه تعريــف .. بس ماذا تقصــد بـ (انتبه هذا ليس تصريح عن متحول) .. كيف يعني تصريح عن متحول ..؟طيب ياليت تذكر لي استخدام اخر لـ #define
او طريقه استخدامه .. بشكل عام ..
عندما تكتب ذلك فى بداية برنامجك
اقتباس#define maxsize 100
فأنت تقوم بتعريف متغير من الممكن ان تستعملة فى الفئة او بداخل اى دالة و ايضا بداخل دالة main دون الحاجة الى اعادة تعريفة مرة اخرى
دعنى اوضح اكثر
انت لو كتبت هكذا
for (i=0; i<= 100; i++){ ... }لو اردت استخدام المتعير i حارج هذا اللوب ليظهر لديك خطأ لانك لم تعرفة لان البرنامج لم يرى هذا المتغير الا بداخل اللوب فقط اى بداخل البلوك
و اى متغير تريد استخدامه فى اكثر من مكان تحتاج الى تعريفة اكثر من مرة مع اعطاءة قيمتة كل مرة
لكن فى الحالة هذة
اقتباس#define maxsize 100
انت لا تضطر الى اعادة التعريف او اعطاء قيم


اقتباسان مثـلا لو عملنا stack
وداخل الـ main()
كتبها مثـلن
stack s(5);
يعني التخزين يتــم بـ s بـ الـ main() وليس داخل الـ كلاس .. ؟ هل يحذفه ام لا ..
اخى اثناء كتباتك للكود انت تضع قيم ابتدائية للبيانات الخاصة بالفئة temporary و اثناء التشغيل من الممكن تغير هذة القيم عن طريق الدالة get صح؟؟
او بأخذ كائن و تغيير القيم عن طريقة
فى نهاية البرنامج يتم تنفيذ Destructors و يبقى الوضع كما هو عليه اى كل شىء يرجع الى وضعه الاصلى اى
كل متغير فى الفئة يرجع الى قيمه الاصلية قبل التغيير
انت تقول اخذت كائن داخل دالة ال main كيف له ان يحذف
لاحظ انى قلت ان ال Destructors يمسح حتى اى object من نوع هذة الفئة التى قمت بكتابتها
و لا تنسى انه يستخدم لتنظيف الذاكرة
اقتباسوطيب قصدك انه المفروض ماكتبــه . .!! لانه اوتوماتيكي المترجم يعمل الحذف ..؟
من الممكن تحديد المتغيرات التى تريد مسحها و لذا تضطر ان تكتبه
و ان لم تكتبخ مافيش اى مشاكل
انظر الى الكود
class Y {
private:
char * string;
int number;
public:
// Constructor
Y(const char*, int);
// Destructor
~Y() { delete[] string; }
};تم تعديل هذه المشاركة بواسطة اسراء شلبى في 2 يونيو 2010 في 12:54


ربي يجزاك الجنـه ..
ولكن كيف استدعاء الداله ؟: ام انها تستدعي نفسها عند انتهى البرنامج ؟
وعندي سؤال اخر .. بس ماحبيت اسوي موضوع جديد .. وهو عن هذا البرنامج لايوجد اخطاء .. ولكن يوجد اخطاء عند التشغيل ..
وهذا هو البرنامج
#include<iostream>
using namespace std;
struct emp {
int element;
emp *next;
emp *prev ;
};
emp *head = NULL;
emp *last = head;
void add()
{
if(head==NULL)
{
cin>>head->element;
head->next =head;
head->prev =NULL;
last=head;
}
else {
emp *tmp = new emp;
cin>>tmp->element;
tmp->next = head;
tmp->prev = last;
last->next = tmp;
last=tmp;
}
}
void main()
{
add();
add();
}تم تعديل هذه المشاركة بواسطة mr.4one في 3 يونيو 2010 في 09:54
اقتباسانها تستدعي نفسها عند انتهى البرنامج
جاوبت على نفسك
لكن بالنسبة للسؤال التانى اعذرنى
ليا كتير مش اشتغلت بالكود دة


اذا كان head == NULL فكيف ستسند قيمة الى احد عناصره (علما بان head مؤشر) دون حجز ذاكرة له اولا ؟!
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
يعطيك الف عافيه .. نسيـت هالشي ههههههه ..
.. ويعطيكي الف عافيــه اسراء
الله يجزاكم بالجنه .. اللهم امين
الـ destructor يستدعى عند حذف الـ object،
الكائن يحذف بطريقتين، حسب طريقة انشائه:
اذا تم انشائه عن طريق new، يجب ان يتم حذفه عن طريق delete
اما اذا تم انشائه مباشرة على الستاك، فسيحذف تلقائيا عندما يغادر الستاك
#include <iostream.h>
class Klass
{
public:
Klass() {
cout << "Klass Contructor!!" << endl;
}
~Klass() {
cout << "Klass Destructor!!" << endl;
}
void check() {
cout << "A Klass Instance is alive!" << endl;
}
};
int main()
{
Klass *a = new Klass(); // this calls the constructor
a->check();
delete a;
Klass b; // constructor
b.check();
// b is deleted when we leave the current scope
}ممكن توضيح اكتر...؟
لانى اتلخبطت خالص
او بمعنى اصح
انا قولت حاجة علط
و ياريت توضيح الجظئية اللى اخطأت فيها


اسراء شلبى كتب:ممكن توضيح اكتر...؟
لانى اتلخبطت خالص
او بمعنى اصح
انا قولت حاجة علط
و ياريت توضيح الجظئية اللى اخطأت فيها
الـ destructor ليس هو اللذي يحرر الذاكرة، فاللذي يحررها هو النظام و يتم هذا في جملة الـ delete
فالـ destructor يمكن ان يحتوي على اي كود و ليس بالضرورة ان يحرر اي ذاكرة ولا اي شي من هذا الكلام.
الـ destructor الهدف منه تحرير موارد النظام الاخرى اللتي يستحوذ عليها الكائن .. مثلا الكائنات الاخرى اللتي يسيطر عليها هذا الكائن، او مثلا لو كان هناك ملفات مفتوحة يسيطر عليها هذا الكائن .. و ما شابه ذلك. (الهدف منه هو ذلك .. لكن يمكن استخدامه لعمل اي شيء آخر .. مثل طباعة جمل على الشاشة :) )
مثلا، تخيلي انه عند انشاء الكائن X يقوم الكائن بانشاء كائن آخر Y يساعده في عمله
ماذا يحدث لو حذفنا X بدون حذف Y؟ عندها الكائتن Y لا يزال موجود في الذاكرة و لكن لا يستخدمه احد، او بمعنى اخر: لا يستطيع احد الوصول اليه .. بالتالي الذاكرة اللتي يحتلها مهدرة.
لذلك يجب ان يحتوي الـ destructor الخاص بـ X على امر لحذف الكائن Y لكي يقوم النظام بتحرير ذاكرته هو الاخر.
تم تعديل هذه المشاركة بواسطة hasan_aljudy في 4 يونيو 2010 في 22:50
ربي يعطيكم الف عافيــه مجداا .. اخي حسان واسراء ..
ولكن عندي سؤال اخــر ..
عن الـ bool مافهمت طريقتها .. سوا في الستاك او غيرها .. وهذا مثال بالستاك
void stack::push (int item)
{
if(!isFull())
{
tos++;
array[tos] = item;
}
}
bool stack::isFull ()
{
return (tos == sizestack - 1);
}الان عندما اعمل اضافه والستاك غير مليئه .. يتم اضافه عنصر .. جديد .. مع ان isFull ترجع قيمـه إن tos == حجم الستاك - 1 .. يعني يرجع عدد العناصر .. وكأنها مملوئه ..؟
ياليت احد يشرح لي بشكل مفصل عن الـ bool ؟؟ وانا اعلم انها ترجع قيم حقيقيه ام زائفه ( Trur Or false ) ولكن كيف ذلك في مثل هذا الكود الي كتبته
هذة الدالة
bool stack::isFull ()
تفوم بأرجاع قيمة من النوع boolean و هذة القيمة تعتمد على شرط الا و هو
(tos == sizestack - 1);
انا اقول شرط لانه يوجد==
اى انا اذا اصبحت قيمة ال tos تساوى حجم ال stack مطروح من واحد
اذا يكون ال stack مملوء و ترجع قيمة true
اما اذا كان tos لا يساوى حجم ال stack مطروح من واحد
اذا يكون الشرط عير صحيح و تقوم الدالة بارجاع قمة false
نأتى الى الدالة الاخرى
void stack::push (int item)
و التى تقوم باضافة عنصر الى ال stack و نجد ان الاضافة هنا تعتمد على شرط قبل ان نضيف اى عنصر
الا و هو
if(!isFull())
لو كان true نستطيع الاصافة و العكس صحيح
نفترض ان الشرط
return (tos == sizestack - 1);
كان خطأ اى false اى ان ال stack ليس مملوء
فعند تنفيذ هذا الشرط
if(!isFull())
نجد وجود علامة نفى اى ان القيمة التى تقوم هذة الدالة بأرجاعها
stack::isFull ()
نقوم بنفيها اى ان لو ارجعت قيمة false فأن الشرط
if(!isFull())
يصبح صحيح و نستطيع الاضافة


لم انتبه الى كلامك اخى
الا بعد كتابة الرد
اقتباسالان عندما اعمل اضافه والستاك غير مليئه .. يتم اضافه عنصر .. جديد .. مع ان isFull ترجع قيمـه إن tos == حجم الستاك - 1 .. يعني يرجع عدد العناصر .. وكأنها مملوئه ..؟
لالالا لا تقوم بأرجاع قيمة integer مثلما تقصد<<لانك بتقول انها بترجع قيمة tos
عند وجود هذة العلا == يعنى ان هذا شرط
و اى شرط فى الدنيا من الممكن ان يكون صحيح او خاطىء true or false
انت تريد ان تعرف ما هى ال bool هو عبارة عن data type عادى جداااااا
مثل ال int يكون للاعداد الصحيحة و ال float يكون للاعداد الغير صحيحة و صغيرة......الخ
اما ال bool يكون true or false و اى شرط تستخدمة يجب ان يقوم بارجاع ايا من القيمتين
مثل
if(max=2)
من الممكن ان يكون صحيح او خاطىء
while(int i=0;i<5;i++)
يوجد هنا شرط الا و هو i<5 اى يجب ان تكون قمة ال i اقل من 5 و عندما تزيد عن 5 يصبح الشرط خاطىء و نخرج من ال loop
و هكذا
تم تعديل هذه المشاركة بواسطة اسراء شلبى في 5 يونيو 2010 في 14:00


اها يعني ارجع الشرط .. يعني هو مايرجع قيمـه ولكن يرجع هل tos = stacksize ؟ هكذا يعني
ويعني ان return ناخذها بمعنى هـــل .. الاصح في هذي الجمله ( وانا اعلم ان return يعني استرجاع ) ولكن لكي افهم بشكل اكبر .. ؟
هل كلامي صحيح ..
واشكرك اختي اسراء
اقتباسويعني ان return ناخذها بمعنى هـــل .. الاصح في هذي الجمله ( وانا اعلم ان return يعني استرجاع ) ولكن لكي افهم بشكل اكبر .. ؟
قبت مسبقا ان bool عبارة true or false اى قيمة مثل اى قمة عادية
لاحظ ان عندما نقوم بتعريف دالة يجب ان تحدد لها retuen data type اى
تعرف تحدد للكومبايلر نوع القمة التى ستفوم الدالة بأرجاعها
تجد ان قبل الدالة
bool stack::isFull ()
كتبنا bool اى هذة الدالة تقوم بارجاع true or false
اما ال key word التى تسمى return ليس لها اى دخل فى نوع القيمة سوى انها تحافظ علىالنوع الذى حددته مسبقا اى اذا كتبت هكذا
داخل الدالة
int x=8; return x;
سيظهر لك خطأ لانك خالف نوع القمة التى حددتها مسبقا قيل اسم الدالة
نستخلص من ذلك ان القيمة التى تقوم الدالة بأرجاعها يجب ان تعتمد على النوع الذى حددته مسبقا
عند تعريف الدالة


وصلت المعلومه ربي يجزاكي الجنــه ..
بالتوفيق اختي اسراء
اقتباسوصلت المعلومه ربي يجزاكي الجنــه ..بالتوفيق اختي اسراء
و لك مثلها اخى الكريم
شكرا على الدعوة الحلوة

