حل شد........
حل شد........
Last edited by ara.look; 20-08-2009 at 21:28.
پس در این صورت شما جایی رو که نفهمیدین بگین تا من توضیح بدم . چون اگه از من بخواین که باز در مورد h. و cpp. توضیح بدم همون مطالب قبلی رو تکرار می کنم . چرا نفهمیدین ؟ چیشو نفهمیدین ؟ نکته خاصی نداره که !!
فکر کنم منظورشون اینه که اسم توابع و نوع پارامتراشون و ... تو فایل h. میریزینبازم من نفهمیدم...
بدنه اصلی توابع و کلاسها که همون کدهاشون میشه رو هم تو فایل cpp. میریزین
البته اینارو دوستمون هم گفتم حالا ما یکم جمله بندیشو تغییر دادیم شاید بفهمید.
---------------------------
جناب sin2x=2sinxcosx به کارتون ادامه بدین ما هم داریم با اینا پیش میریم ببینیم آخر این ++C رو یاد می گیریم یا نه
راستی یکی از مثالاتون شبیه یه سوال امتحانیمون بود ، نکنه طراح سوالای ما بودین
جمله بندیتون هم خیلی باحاله، این جملتون رو میگم
تو ارث بري هم ميگيم فلان يه فلان است .
سوال من اینجاست که چرا این کار میکنن؟فکر کنم منظورشون اینه که اسم توابع و نوع پارامتراشون و ... تو فایل h. میریزین
بدنه اصلی توابع و کلاسها که همون کدهاشون میشه رو هم تو فایل cpp. میریزین
البته اینارو دوستمون هم گفتم حالا ما یکم جمله بندیشو تغییر دادیم شاید بفهمید.
---------------------------
با عرض سلام و تشکر .نوشته شده توسط hoax3r [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
منظورم از فلان یه فلان است این بود که مثلا اگه دو تا کلاس به نام های base و derived داشته باشیم و کلاس derived از کلاس base به ارث رسیده باشد ، در این صورت میگیم : derived یه base است .
ولی تو Composition میگیم : فلان یه فلان دارد .
در این مورد هم توضیح دادم :سوال من اینجاست که چرا این کار میکنن؟
من هم ان شاءالله پست بعدیم راجع به Operator Overloading خواهد بود . دارم الان آماده می کنم .2- اتفاقا اين کلاس رو به دو فايل h. و cpp. تبديل مي کنيم تا مفهوم شيء گرايي حفظ بشه . به کاربري که قصد استفاده از اين کلاس ما رو داره فقط فايل هدر داده ميشه که فقط اينو بدونه که اين کلاس ما چه توابعي دارن و چه آرگومان هايي مي گيرن . با ارائه توضيحات در فايل هدر توسط برنامه نويس کلاس ، ميشه بهتر کاربر برنامه نويس تابع main رو در جهت استفاده از کلاس راهنمايي کرد . فايل کامپايل شده فايل cpp کلاس هم به مشتري يا همون استفاده کننده از کلاس داده ميشه که بتونه به فايل h. پيوند بزنه . Source فايل cpp نبايد در دسترس مشتري قرار بگيره و اين همون مفهوم کپسوله سازي و مهندسي نرم افزار و تکنولوژي شيء گراييه که مشتري نبايد از چگونگي پياده سازي توابع اطلاع داشته باشه . فقط کافيه بدونه که چه توابعي وجود دارن و اين توابع چيکار مي کنن . ديگه لازم نيست بدونه که چه الگوريتمي براي انجام اين کار پياده سازي شده .
در مورد اين هم که هر کس فايل هدر رو داشته باشه مي تونه فايل cpp رو از روي اون بنويسه ، بايد بگم که خوب بنويسه . چه اشکالي داره . مهم اينه که به پياده سازي مدنظر ما لطمه وارد نشه .
Last edited by sin2x=2sinxcosx; 01-08-2009 at 14:47.
خوب حالا پس از مدت ها : سربارگذاری عملگر یا Operator Overloading
سربارگذاری همون طوری که از اسمش مشخصه یعنی گذاشتن بار اضافی . همین کلمه اضافی و درک اون تو مفهوم سربارگذاری خیلی مهمه . بعدا میگم یعنی چی . پس سربارگذاری عملگر میشه گذاشتن بار اضافی روی عملگر .
فرض کنین ما یه کلاس تعریف کردیم به اسم HugeInteger . این کلاس ، کلاس معروفی هست که کاربر می تونه ایجاد کنه تا محدودیت های نوع داده int رو جبران کنه . نوع داده int فکر کنم حداکثر تا 12 رقم پشتیبانی می کنه . با پیاده سازی کلاس HugeInteger میشه کلاس ( یا نوع داده جدیدی ) ایجاد کرد که تا بی نهایت رقم پشتیبانی کنه .
خوب فرض کنین ما برای این کلاسمون یه تابع عضو تعریف کردیم که عمل جمع رو بین دو تا شیء HugeInteger انجام میده . با فراخوانی این تابع به صورت مثلا زیر می تونیم این کارو انجام بدیم :
یعنی به تابع sum موجود تو کلاسمون ، دو تا شیء HugeInteger به نام های h1 و h2 می فرستیم و این تابع این دو تا رو جمع می کنه و نتیجه رو در قالب یه شیء HugeInteger دیگه به ما برمی گردونه .کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی وقتی می خوایم دو تا int رو با هم جمع کنیم چیکار می کنیم ؟ خیلی راحت می نویسیم :
ولی اگه بخوایم از عملگر + برای یه نوع داده ای ، غیر از انواع داده اصلی ( int, double, float, long ) مثلا برای کلاس HugeInteger استفاده کنیم از جانب Compiler اروری با این مضمون دریافت می کنیم :کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی ما دوست داریم از این عملگر برای کلاس خودمون بین دو تا شیء HugeInteger استفاده کنیم . برای این کار باید ما عملگر + رو برای کلاسمون سربارگذاری کنیم و این مفهوم سربارگذاری عملگر هست .کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
چند نکته در مورد سربارگذاری عملگر ها :
1- با سربارگذاری نمی توان عملگرهای جدید ایجاد کرد . فقط عملگرهای موجود را می توان سربارگذاری کرد .
2- با سربارگذاری یک عملگر ، عملگر مربوطه علاوه بر اینکه بین انواع داده ای اصلی مثل int تعریف شده است ، برای کلاس موردنظر ما هم تعریف شده خواهد بود . یعنی با سربارگذاری یک عملگر برای یک کلاس ، آن عملگر باز هم به وظیفه های قبلی خود در مورد انواع داده ای دیگر آشنا است . ( همون مفهوم کلمه بار اضافی اینجا بود . )
3- چهار عملگر وجود دارد که نمی توان آن ها را سربارگذاری کرد :
بقیه عملگر ها قابل سربارگذاری هستند . حتی عملگرهای new و delete .کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
4- دو عملگر زیر تنها عملگرهایی هستند که قادرند بدون سربارگذاری با هر نوع داده ای بکار روند :
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مرسی.
ولی کاش 1 خط کد هم می نوشتید که چجوری باید سربارگذاری کرد!
آخه این فقط شد تعریفش!
منبع : Prentice.Hall.C.plus.plus.How.to.Program.5th.Editi on.Jan.2005.INTERNAL
1 // Fig. 11.4: PhoneNumber.cppکد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
2 // Overloaded stream insertion and stream extraction operators
3 // for class PhoneNumber.
4 #include <iomanip>
5 using std::setw;
6
7 #include "PhoneNumber.h"
8
9 // overloaded stream insertion operator; cannot be
10 // a member function if we would like to invoke it with
11 // cout << somePhoneNumber;
12 ostream &operator<<( ostream &output, const PhoneNumber &number )
13 {
14 output << "(" << number.areaCode << ") "
15 << number.exchange << "-" << number.line;
16 return output; // enables cout << a << b << c;
17 } // end function operator<<
18
19 // overloaded stream extraction operator; cannot be
20 // a member function if we would like to invoke it with
21 // cin >> somePhoneNumber;
22 istream &operator>>( istream &input, PhoneNumber &number )
23 {
24 input.ignore(); // skip (
25 input >> setw( 3 ) >> number.areaCode; // input area code
26 input.ignore( 2 ); // skip ) and space
27 input >> setw( 3 ) >> number.exchange; // input exchange
28 input.ignore(); // skip dash (-)
29 input >> setw( 4 ) >> number.line; // input line
30 return input; // enables cin >> a >> b >> c;
31 } // end function operator>>
[/CODE]
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
Overloading Unary OperatorsOverloading Binary Operatorsکد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
Overloading ++ and --کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ممنون ها آبجی، ولی 1 کم نا مفهوم بود!
آخه زبان شیرین پارسی رو ول کردید، به زبان خارجه () نوشتید، اون هم با نظم کم و ...
تقریباً فهمیدم مطلب چیه.
ولی اگر فارسی توضیح بدید، حداقل برای تازه کار ها بهتره.
ممنون از لطفتون
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)