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

سؤال عن Adt

بدأه توشيبا في 4 يناير 2009 · 8 رد · 902 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

انا عندي برنامج يحتوي على اكثرمن صنفclass احد الاصناف مثلا

صنف 1 يستقبل برامتر object من نوع صنف 2

الحمد لله هذي قدرنا وضبطناها المهم الحين راح نغير وبنجعل صنف 2 ADT يعني مااقدر اسوي منه اوبجكت

السؤال كيف اعدل في الصنف الاول بحيث انو يبقى عادي يستقبل من نوع الصنف الثاني

إن شاء الله يكون السؤال مفهوم

ولو كان الشرح بمثال بسيط افضل

#2

مالذي تقصده ؟ abstract data type !

ضع الكود لتكون فكرتك أوضح.

#3

اقصد بADT اني عرفت في الصنف 1 دالة وساويتها بصفر

يعني مااقدر اسوي من صنف 1 اوبجكت

المشكلة انو فيه صنف اخر في احد الدوال يستقبل كبارامتر اوبجكت من هذا الصنف (صنف 1)

ايش اسوي في هذا الاوبجكت حتى يمشي عادي بدون اي مشاكل

#4

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

ارسل مؤشر من الكلاس الabstract للكلاس الثاني ، فقط :) .

مثال بسيط -لتوضيح- :

شركه لديها العديد من الموظفين (مبرمجين مبتدئين ، خبراء) وتريد كتابه برنامج لحفظ بيانات الموظفين ، ستقوم بالتصميم الأتي :

class Employer وتجعله abstract (عن طريق عمل داله pure-virtual function) .

وتقوم بالوراثه من Employer لـ Beginner وأيضا لـ Guru .

الكلاس الرئيسي Company ، سوف يحتوي على List من الموظفين (سواء كانت linked list أو vector أو اي container أخر) ، ومثلا يحتوي على داله تسمى addEmployer تستقبل مؤشر للEmployer وتقوم باضافه هذه القيمه للlist .

الان في البرنامج الرئيسي عندما تريد استدعاء الداله addEmployer سوف تمرر لها أحد أبناء الEmployer :

Employer* employer = new Guru("any Name");

company.addEmployer(employer);

بالطبع لن تستطيع ارسال كائن Employer لأتك لا تستطيع انشائه من الأصل ، ولكنك ستمرر أحد أبناء ذلك الكائن ،

بعدها يمكن زياده الموظفين وادخال ربما Expert وهنا لن تضر لعمل أي تغيير في الCompany وهذه easy of extendability أحد مزايا OO وبالتحديد الPolymorphism .

بالتوفيق :) .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#5

مشكورررررررررين

الحمد لله ضبط

#6

طيب انا الحين واجهتني في هذا البرنامج مشكلة ثانية

الحين راح نسوي المين والمطلوب نسوي مصفوفة من الكلاس اللي عرفته ADT

سويت انكلود لهذا الكلاس ولكن لما اسوي من نفس النوع مصفوفة يقول خطأ

ماادري ليش المشكلة انها لازم تكون مصفوفة

واللي اعرفه ان المصفوفة عبارة عن مؤشر فالمفروض تمشي عادي

المشكلة الثانية اني راح اسوي مصفوفة ثانيه من نوع كلاس ثاني عادي

ونفس الشي يقول خطأ

الله يعافيكم اذا كان فيه طريقة لتعريف مصفوفة من نوع انا معرفه ارشدونا لها

#7

انشيء مصفوفه من المؤشرات للكائن ، وليس مصفوفه من الكائنات ..

Object* ptr[100]; 
// ....
ptr = new subObject1;
ptr = new subObject2;
//.....
ptr->getValue();

بالنسبه للمشكله الثانيه فتعريف مصفوفه من الكائنات بشكل عادي :

Student s[100[;

مع الأنتباه أنك يجب أن تزود الكلاس student بداله بناء افتراضيه default constructor لا يأخذ قيمه ، (هذا في حال كنت كاتب داله بناء تأخذ قيم ، أم اذا لم تكتب فلا توجد مشكله لأن المترجم سوف يزودك بها) .

بالتوفيق ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#8

طيب مشكور اخوي وما قصرت

لازم الحين اسوي دلييت للبوينتر قبل مااطلع من المين والا لا

وسؤال ثاني

انا عملت منيو (قائمة)واول خيار يطلب انو يدخل اسم الطالب بعدين يخزنه في اول ندكس وهكذا

انا مالقيت له الا فكرة المشكلة في السنتاكس مافي ايرور لكن لما يعمل رن اذا دخل هاذا الخيار يطلب الاسم وبعدين يسوي لوب لانهائي ما ادري وين المشكلة

CODE
case 1:

cout<<"Enter the name of student:";

cin>>name;

stu[studentcounter]=new student(name,6,1,2009);

studentcounter++;

break;

اول حاجه انا حطيت طول الاري عشرة

والكاونتر ساويته بصفر بحيث انو اول طالب يحفظه في اول اندكس واذا دخل واحد مرة ثانية يحفظه في ثاني اندكس

والstudentيستقبل برامتر من الاسم والتاريخ وهو مثبت

ماادري ليه يعلق عند ذا الكيس

#9

نعم عليك بتحرير الذاكره بما أنك قمت بحجزها فور أنتهاء block والا سوف يذهب المؤشر وتبقى الذاكره محجوزه memory leak ، وفي كلا الحالات اذا لم تحررها بنفسك ستتحرر عندما ينتهي عمل البرنامج ..

بالنسبه للكود ، فلا توجد مشكله ، ولكن ربما المشاكل من أجزاء أخرى ، عليك التأكد من موقع الخطأ هل هو في case 1 أو 2 أو موقع أخر ..

اذا كنت تستطيع استخدام Dubegger فيمكنك تتبع تنفيذ البرنامج حتى تكشف موقع الخطأ .. والا قم بذلك يدويا عن طريق عمل تعليق لجميع الكود واترك case1 يعمل واختبر البرنامج ، فاذا عمل بشكل صحيح فمعنى أن المشكله في موقع أخر .. فقم بفتح case 2 واستمر هكذا الى أن تجد موقع الخطأ .

في حال تجد طريقه لمعرفه الخطأ، فاعرض الكود حتى نحاول أن نساعدك بشكل أكبر ،،

بالتوفيق .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

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