الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

نقاط بسيطه مبهمه ب stack

بدأه mr.4one في 2 يونيو 2010 · 24 رد · 1,134 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

االسلام عليكم

فيه نقاط بسيطه مبهمه مثــل

وش معنى هالسطر .. "

#define maxsize 100

وأيش معنىا هذا ؟

Stack::~Stack()
{

}

مع انـه عرفناهـ بـ الكلاس

بس ليش عرفناه وليش سويناه بالاصـل ؟

وعرفناه هيـك بـ public

	virtual ~Stack();

واكون لكم من الشاكرين

#2
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

3
00020309t.gif

1958_1963.gif
#3

معليش يا اسراء ياليت شرح اكثر توضيح لاني مبتدئ .. .

وياليت تشرحين لي هالنقطه كمان

#define maxsize 100

يعطيكي الف عافيه

#4

mr.4one كتب:

#define maxsize 100

أنت تعطي للعبارة maxsize قيمة مساوية لـ 100 (انتبه :excl: هذا ليس تصريح عن متحول)

الآن في أي مكان في برنامجك تكتب فيه maxsize عندما تطلب بناء البرنامج سيقوم الكومبايلر باستبدال هذه العبارة بالقيمة 100.

أي أن:

for (i=0; i <= maxsize; i++){ ... }

تماثل تماماً

for (i=0; i<= 100; i++){ ... }

والغرض من التصريح عنها جعل البرنامج أكثر قابلية للقراءة وفهم للقيم.

3

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

طيب يآخي عرفت انه تعريــف .. بس ماذا تقصــد بـ (انتبه هذا ليس تصريح عن متحول) .. كيف يعني تصريح عن متحول ..؟

طيب ياليت تذكر لي استخدام اخر لـ #define

او طريقه استخدامه .. بشكل عام ..

وثآني شي ..:

ياليت تشرح .. بشكل تفصيلي .. عن

Stack::~Stack()
{

}

مع انـه عرفناهـ بـ الكلاس

بس ليش عرفناه وليش سويناه بالاصـل ؟

وعرفناه هيـك بـ public

        virtual ~Stack();
#6
اقتباس
معليش يا اسراء ياليت شرح اكثر توضيح لاني مبتدئ ..

حاضر هحاول

عندما تكتب الفئة خاصتك من الممكن ان تحتوى على بعض الدوال التى تقوم ببعض المهام التى تريدها انت

توجد دالة يتعرف عليها الكومبايلر اثناء تنفيذ البرنامج و ليس ككل الدوال لذا فهى دالة خاصة 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

1
00020309t.gif

1958_1963.gif
#7

و لا تنسى اخى الكريم الخواص التى ذكرتها فى مشاركتى الاول

00020309t.gif

1958_1963.gif
#8

طيب .. اختي كيف يتم استدعائه هالداله .. عشان يحذف البيانات .. !!

Stack::~Stack(){}

او انه اوتوماتيكي يستدعي نفسه عند نهايه البرنامج ؟ ..

وطيب قصدك انه المفروض ماكتبــه . .!! لانه اوتوماتيكي المترجم يعمل الحذف ..؟

طيب الي فهمتــه ..

ان مثـلا لو عملنا stack

وداخل الـ main()

كتبها مثـلن

stack s(5);

يعني التخزين يتــم بـ s بـ الـ main() وليس داخل الـ كلاس .. ؟ هل يحذفه ام لا ..

واشكرك ع اجابتك

طيب هذا مثال بسيط .. طيب هل يتم حذف الـ s واذا كان يتم الحذف البيانات .. ليــه ؟ مع اني حجزتها داخل الـ main

Stack::~Stack()
{

}


void main()
{

	Stack s(5);


}
#9
اقتباس
طيب يآخي عرفت انه تعريــف .. بس ماذا تقصــد بـ (انتبه هذا ليس تصريح عن متحول) .. كيف يعني تصريح عن متحول ..؟

طيب ياليت تذكر لي استخدام اخر لـ #define

او طريقه استخدامه .. بشكل عام ..

عندما تكتب ذلك فى بداية برنامجك

اقتباس
#define maxsize 100

فأنت تقوم بتعريف متغير من الممكن ان تستعملة فى الفئة او بداخل اى دالة و ايضا بداخل دالة main دون الحاجة الى اعادة تعريفة مرة اخرى

دعنى اوضح اكثر

انت لو كتبت هكذا

for (i=0; i<= 100; i++){ ... }

لو اردت استخدام المتعير i حارج هذا اللوب ليظهر لديك خطأ لانك لم تعرفة لان البرنامج لم يرى هذا المتغير الا بداخل اللوب فقط اى بداخل البلوك

و اى متغير تريد استخدامه فى اكثر من مكان تحتاج الى تعريفة اكثر من مرة مع اعطاءة قيمتة كل مرة

لكن فى الحالة هذة

اقتباس
#define maxsize 100

انت لا تضطر الى اعادة التعريف او اعطاء قيم

1
00020309t.gif

1958_1963.gif
#10
اقتباس

ان مثـلا لو عملنا 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

1
00020309t.gif

1958_1963.gif
#11

ربي يجزاك الجنـه ..

ولكن كيف استدعاء الداله ؟: ام انها تستدعي نفسها عند انتهى البرنامج ؟

وعندي سؤال اخر .. بس ماحبيت اسوي موضوع جديد .. وهو عن هذا البرنامج لايوجد اخطاء .. ولكن يوجد اخطاء عند التشغيل ..

وهذا هو البرنامج

#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

#12
اقتباس
انها تستدعي نفسها عند انتهى البرنامج

جاوبت على نفسك

لكن بالنسبة للسؤال التانى اعذرنى

ليا كتير مش اشتغلت بالكود دة

00020309t.gif

1958_1963.gif
#13

اذا كان head == NULL فكيف ستسند قيمة الى احد عناصره (علما بان head مؤشر) دون حجز ذاكرة له اولا ؟!

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#14

يعطيك الف عافيه .. نسيـت هالشي ههههههه ..

.. ويعطيكي الف عافيــه اسراء

الله يجزاكم بالجنه .. اللهم امين

#15

الـ 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
}

http://codepad.org/rB26utWo

2
#16

ممكن توضيح اكتر...؟

لانى اتلخبطت خالص

او بمعنى اصح

انا قولت حاجة علط

و ياريت توضيح الجظئية اللى اخطأت فيها

00020309t.gif

1958_1963.gif
#17
اسراء شلبى كتب:

ممكن توضيح اكتر...؟

لانى اتلخبطت خالص

او بمعنى اصح

انا قولت حاجة علط

و ياريت توضيح الجظئية اللى اخطأت فيها

الـ destructor ليس هو اللذي يحرر الذاكرة، فاللذي يحررها هو النظام و يتم هذا في جملة الـ delete

فالـ destructor يمكن ان يحتوي على اي كود و ليس بالضرورة ان يحرر اي ذاكرة ولا اي شي من هذا الكلام.

الـ destructor الهدف منه تحرير موارد النظام الاخرى اللتي يستحوذ عليها الكائن .. مثلا الكائنات الاخرى اللتي يسيطر عليها هذا الكائن، او مثلا لو كان هناك ملفات مفتوحة يسيطر عليها هذا الكائن .. و ما شابه ذلك. (الهدف منه هو ذلك .. لكن يمكن استخدامه لعمل اي شيء آخر .. مثل طباعة جمل على الشاشة :) )

مثلا، تخيلي انه عند انشاء الكائن X يقوم الكائن بانشاء كائن آخر Y يساعده في عمله

ماذا يحدث لو حذفنا X بدون حذف Y؟ عندها الكائتن Y لا يزال موجود في الذاكرة و لكن لا يستخدمه احد، او بمعنى اخر: لا يستطيع احد الوصول اليه .. بالتالي الذاكرة اللتي يحتلها مهدرة.

لذلك يجب ان يحتوي الـ destructor الخاص بـ X على امر لحذف الكائن Y لكي يقوم النظام بتحرير ذاكرته هو الاخر.

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 4 يونيو 2010 في 22:50

1
#18

شكرا اخى الكريم

جزاك الله الجنة

00020309t.gif

1958_1963.gif
#19

ربي يعطيكم الف عافيــه مجداا .. اخي حسان واسراء ..

ولكن عندي سؤال اخــر ..

عن الـ 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 ) ولكن كيف ذلك في مثل هذا الكود الي كتبته

#20

هذة الدالة

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())

يصبح صحيح و نستطيع الاضافة

2
00020309t.gif

1958_1963.gif
#21

لم انتبه الى كلامك اخى

الا بعد كتابة الرد

اقتباس

الان عندما اعمل اضافه والستاك غير مليئه .. يتم اضافه عنصر .. جديد .. مع ان 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

1
00020309t.gif

1958_1963.gif
#22

اها يعني ارجع الشرط .. يعني هو مايرجع قيمـه ولكن يرجع هل tos = stacksize ؟ هكذا يعني

ويعني ان return ناخذها بمعنى هـــل .. الاصح في هذي الجمله ( وانا اعلم ان return يعني استرجاع ) ولكن لكي افهم بشكل اكبر .. ؟

هل كلامي صحيح ..

واشكرك اختي اسراء

#23
اقتباس
ويعني ان return ناخذها بمعنى هـــل .. الاصح في هذي الجمله ( وانا اعلم ان return يعني استرجاع ) ولكن لكي افهم بشكل اكبر .. ؟

قبت مسبقا ان bool عبارة true or false اى قيمة مثل اى قمة عادية

لاحظ ان عندما نقوم بتعريف دالة يجب ان تحدد لها retuen data type اى

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

تجد ان قبل الدالة

bool stack::isFull ()

كتبنا bool اى هذة الدالة تقوم بارجاع true or false

اما ال key word التى تسمى return ليس لها اى دخل فى نوع القيمة سوى انها تحافظ علىالنوع الذى حددته مسبقا اى اذا كتبت هكذا

داخل الدالة

int x=8;
return x;

سيظهر لك خطأ لانك خالف نوع القمة التى حددتها مسبقا قيل اسم الدالة

نستخلص من ذلك ان القيمة التى تقوم الدالة بأرجاعها يجب ان تعتمد على النوع الذى حددته مسبقا

عند تعريف الدالة

1
00020309t.gif

1958_1963.gif
#24

وصلت المعلومه ربي يجزاكي الجنــه ..

بالتوفيق اختي اسراء

#25
اقتباس
وصلت المعلومه ربي يجزاكي الجنــه ..

بالتوفيق اختي اسراء

و لك مثلها اخى الكريم

شكرا على الدعوة الحلوة

00020309t.gif

1958_1963.gif

مواضيع مشابهة