صفحه نخست  •  فهرست تالارها  •  نگارخانه  •  لیست اعضا  •  گروه‌ها  •  جستجو  •  ورود
 
1
ارسال موضوع جدیدپاسخ به موضوع
نویسنده پیغام
mhajiآفلاين
آخر آدم بيکار!
آخر آدم بيکار!

آواتار

تاريخ عضويت: دوشنبه 19 خرداد 1382
مجموع ارسالها: 3420
اعتبار کسب شده: 3000
محل سکونت: Montreal
جنسيت: مرد
ارسال پنجشنبه 03 آبان 1386، ساعت 0:30
 1 سال و 1 ماه پيش
#1
 
اگه جزء اکثريت 99.9 درصدي کاربران تالار هستيد، اين تاپيک رو سريعا يکبار براي هميشه ترک کنيد!
در غير اين صورت، يه استثناي پرتاب شده هستيد و ميتونيد ادامه بديد:

همه ما با قالبهاي طراحي نرم افزار کم و بيش کار کرديم. حداقل با الگوهاي پراستفاده اي مثل Factory ،Visitor ،Adaptor ،Singleton آشناييم. کتابهاي بسيار خوبي در زمينه الگوهاي طراحي نوشته شده از جمله Modern C++ Design: Generic Programming and Design Patterns Applied. اما من حتي در بين جدي ترين دوستان کامپيوتريم، تا حالا کسي رو نديدم که همه الگوهاي طراحي يا حداقل قسمت عمده اشون رو بشناسه. مشکل اينجاست که يادگيري و به خاطر سپردن يک قالب براي کسي که در عمل با اون مساله (وضعيت) طراحي خاص مواجه نشده باشه کار سختيه. خب حالا راه حل چيه؟! طبيعتا اينه که وقتي حس کرديم طراحيمون خيلي داره ماست مالي ميشه بريم قالب مناسبش رو پيدا کنيم. اما اگه نتونستيم چي؟ اگه تمام الگوهايي رو که حدس ميزنيم مناسب هستند مطالعه کرديم و باز هم هيچ کدوم جوابگو نبودند چي؟ اين خريته که فکر کنيم مساله ما اينقدر پيچيده است که يه قالب جديد لازم داشته باشه و بخوايم يه الگوي طراحي جديد بسازيم! اما من همچين خريتي کردم و حالا ميخوام بدونم الگويي که ساختم مشکلش چيه يا اگه يکي از قبليهاست اسمش چيه. براي اين بود که اين تاپيک رو بالاخره ساختم!

مساله من اينه: دو تا کلاس فرزند (derived class) دارم که از يک کلاس والد مجرد (abstract base class) ارث ميبرند. اين کلاسها علاوه بر اينکه در خيلي از توابع مشترکند در قسمت عمده اي از خود سازنده کلاس (constructor) هم يکسان هستند و طبيعتا دوست دارم (يعني مجبورم که دوست داشته باشم) قسمت مشترک کد مربوطه رو به سازنده کلاس چند ريختي (polymorphic) والد انتقال بدم. اما مشکل اينجاست که در سازنده کلاس مجرد نميتونيم توابع مجازي محض (pure virtual function) رو مستقيم يا غير مستقيم صدا بزنيم Sad در واقع ميتونيم صدا بزنيم ولي با اين پيغام خطاي زمان اجرا مواجه ميشيم: Pure Virtual Function Called و برنامه در همينجا ميپکه!

خب حالا کسي الگوي طراحي مناسبي ميشناسه؟ يا هر راه حل ديگه اي که به اصول شيء گرا پايبند باشه؟ يعني کد مشابه يا يکسان کپي و پيست نشه و اضافه کردن يک کلاس جديد نيازي به تغيير کد بقيه کلاسها نداشته باشه!
راه حل خودم رو بعدا - در پست شماره 2 - مينويسم.
 
1
1
0
پاسخ به صورت نقل قول بازگشت به بالای صفحه
TITANآفلاين
آخر آدم بيکار!
آخر آدم بيکار!

آواتار

تاريخ عضويت: شنبه 23 دي 1385
مجموع ارسالها: 1135
اعتبار کسب شده: 3874
محل سکونت: بين هيچ کجا و خداحافظ
سن: 27
جنسيت: مرد
ارسال پنجشنبه 03 آبان 1386، ساعت 7:10
 1 سال و 1 ماه پيش
#2
 
mhaji نوشته بود:
اگه جزء اکثريت 99.9 درصدي کاربران تالار هستيد، اين تاپيک رو سريعا يکبار براي هميشه ترک کنيد!



وقتي pattern Design را ملاحظت فرموديم، با خويش انديشيديم که اين تاپيک مخصوص اين حضرت است، اما رويت فرموديم که راجعبه ++C و اينجور سوسل بازي هاست که به مزاقمان خوش نخواهد آمد، اراده همايوني فرموديم و کامل نخوانديم..

_________________
خوشبختي را ديروز به حراج گذاشتند حيف من زاده ي امروزم. خدايا جهنمت فرداست پس چرا امروز مي سوزم‌

در شبان غم تنهايي خويش، عابد چشم سخن گوي توام
 
1
1
0
پاسخ به صورت نقل قول بازگشت به بالای صفحه
اميرحسينآفلاين
آخر آدم بيکار!
آخر آدم بيکار!

آواتار

تاريخ عضويت: چهارشنبه 06 مهر 1384
مجموع ارسالها: 1617
اعتبار کسب شده: 3000
محل سکونت: ايران
جنسيت: مرد
ارسال پنجشنبه 03 آبان 1386، ساعت 13:19
 1 سال و 1 ماه پيش
#3
 
راهنمايي:
"Pure Virtual Function Called": An Explanation
منبع:
Image
 
1
1
0
پاسخ به صورت نقل قول بازگشت به بالای صفحه
mhajiآفلاين
آخر آدم بيکار!
آخر آدم بيکار!

آواتار

تاريخ عضويت: دوشنبه 19 خرداد 1382
مجموع ارسالها: 3420
اعتبار کسب شده: 3000
محل سکونت: Montreal
جنسيت: مرد
ارسال جمعه 04 آبان 1386، ساعت 1:20
 1 سال و 1 ماه پيش
#4
 
راه حل پيشنهادي من اينه. فرض کنيد P کلاس پايه باشه و C1 و C2 کلاسهاي مشتق شده.
براي کلاس P يک تابع مجازي با prototype زير تعريف ميکنيم:

virtual P* createP( Map<ArgumentName, ArgumentValue> & arguments );


و همچنين يک تابع مجازي static که در واقع ميخواد وظايف تابع سازنده (constructor) کلاس P رو به عهده بگيره. اسم اين تابع رو ميتونيم بذاريم initializer (يا staticConstructor):

static P* initializer( P* p, Map<ArgumentName, ArgumentValue>& arguments);


اين تابع چون constructor يا destructor نيست ميتونه توابع مجازي P رو صدا بزنه و به اين ترتيب چند ريختي (polymorphism) در سازنده امکانپذير ميشه!


و اما در کلاسهاي فرزند، مثلا C1، تابع createP رو به سادگي به شکل زير تعريف ميکنيم:

virtual P* createP( Map<ArgumentName, ArgumentValue> & arguments )
{
return new C1( ... ); // extract constructor arguments from the map and call the constructor
}

و تابع سازنده کلاس فرزند هم بعد از مقداردهي هاي اوليه خودش، staticConstructor کلاس P رو صدا ميزنه:

C1( ... )
{
...
// put the constructor arguments into the map and call the parent's static constructor
P::initializer( this, arguments );
}



به دليل ضيق وقت خلاصه نوشتم. اگه جاييش مبهم بود بگيد تا بيشتر توضيح بدم.
قسمتي از ايده اين راه حل رو از الگوي Factory گرفتم و در عمل کار ميکنه و ظاهرا به اصول شيء گرايي پايبنده! عقل من در همين حد ميرسه. اما مشتاقم يکي راهنمايي کنه. ميخوام بدونم راه حلم چه ايرادي داره و الگوي طراحي استاندارد براي وضعيتي که توصيف کردم - اگه وجود داره - چيه.


اميرحسين نوشته بود:
راهنمايي:
"Pure Virtual Function Called": An Explanation


متشکرم. مقاله رو اجمالا خوندم. ظاهرا فقط به مشکل اشاره کرده و راهنمايي يا راه حلي ارائه نداده؟!
 
1
1
0
پاسخ به صورت نقل قول بازگشت به بالای صفحه
نمایش پیغامهای ارسال شده قبلی:      
ارسال موضوع جدیدپاسخ به موضوع
موضوعات مرتبط
هيچ پيغام جديدي ارسال نشده است مسابقه طراحي Header براي تالارهاي گفتمان
3
پاسخها: 19 بیننده: 800 نویسنده: سياسفيد
هيچ پيغام جديدي ارسال نشده است همکاري در توسعه و بهبود نرم افزار تالارهاي گفتمان
6
پاسخها: 44 بیننده: 1704 نویسنده: احسان
هيچ پيغام جديدي ارسال نشده است در محيط word يا هر نرم افزار ديگري نستعليق بنويسيد
1
پاسخها: 10 بیننده: 934 نویسنده: ice.plus
هيچ پيغام جديدي ارسال نشده است تذکر مهم در مورد جواب هاي مهندسي نرم افزار 1
1
پاسخها: 3 بیننده: 1347 نویسنده: حسين

مشاهده موضوع قبلی مشاهده موضوع بعدی
قبلی تالار بعدی

 پرش به:   

شما نمی‌توانید در این تالار موضوع جدیدی ارسال کنید
شما نمی‌توانید به موضوعات این تالار پاسخ دهید
شما نمی‌توانید پیغامهای ارسالی خود در این تالار را، ویرایش کنید
شما نمی‌توانید پیغام های ارسالی خود در این تالار را حذف کنید
شما نمی‌توانید در نظرسنجی‌های این تالار شرکت کنید
قوانين تالارهاي گفتمان گزارش خطا
سوال در مورد تالارهاي گفتمان پيشنهاد
تمام ساعات و تاریخها بر حسب 4.5+ ساعت گرینویچ می‌باشند
تبليغات: