PDA

View Full Version : کلاس تک دونقطه : یعنی چی؟



hosseinam1370
جمعه 04 مهر 1393, 22:47 عصر
سلام دوستان، من داشتم به مراحل یاد گیریم ادامه میدادم ، تا اینکه رسیدم به این کلاسی که فقط با یک : تعریف شده، که اصلا جایی دیده نبودمش و جایی پیداش نکرده بودم و حتی تو کتابم (جعفر نژاد قمی) انگار نبود اصلا، حالا ذهنمو درگیر کرده که این دیگه چجور تعریف کلاسی هست،و اینم کد :
class divideByZeroException : public runtime_error
{
public:

divideByZeroException()
: runtime_error( "attempted to divide by zero" ) {}
};



در ضمن اگه میدونید میتونید بگید منظور از این ستاره هایی که بغل اسم تاپیک ها تو انجمن هست چیه؟ این عکس و ببینید:

http://8pic.ir/images/8vypr0ha0n3i7m8vo6yc.png

با تشکر.

parvizwpf
جمعه 04 مهر 1393, 23:21 عصر
اگه منظور دو نقطه بعد از نام کلاس هست، داره میگه که کلاس از چیزهایی مشتق بشه. وبعد از نام سازنده هم، مقدار دهی به کلاس والد در حین ساخت کلاس هست.

حمید رضا رحیمیان
جمعه 04 مهر 1393, 23:29 عصر
سلام

در واقع این کد میگه که divideByZeroException فرزند کلاس runtime_error هست. در واقع این کلاس میتواند با این تعریف از تمام توابع و مقادیر کلاس runtime_error
چه به صورت خصوصی و چه به صورت عمومی استفاده کنه.

مظور رتبه ای است که به ان تایپک از طرف کاربران داده شده

hosseinam1370
شنبه 05 مهر 1393, 08:36 صبح
آیا مشتق کلاس از تمامی توابع و متغییر های private یا protect هم میتونه استفاده کنه؟یا شرایط خاصی داره؟

-----------------------------------------------
فهمیدم اون رتبه رو .ممنون.


با تشکر.

hosseinam1370
شنبه 05 مهر 1393, 22:14 عصر
باز یه جا دیدم که سر در نیاوردم، برا همین یکم مزاحمتون میشم.
دوستان این کد رو ببینید :
class kiloToGeram : public convertClass
{
public :
kiloToGeram (double x ) : public convertClass (x) { };
virtual void compute();
}

الان kiloToGeram مشتقی از کلاس convertClass هست ، خوب،
حالا چرا تو بدنه :
kiloToGeram (double x ) : public convertClass (x) { };
مثل یه تابع باهاش برخورد شد؟

اصلا منظور از این خط چیه؟


با تشکر.

حمید رضا رحیمیان
یک شنبه 06 مهر 1393, 10:31 صبح
سلام
بله از همه ی توابع کلاس پدر میتونه کلاس فرزند استفاده کنه.

در مورد این موضوع من این طوری تا حالا ندیدم که بعد از تابع با public مقدار دهی کرد ولی در کل میتونید در کلاس ها بعد از مغرفی تابع مواردی را مقدار دهی کنید.
مثلا در مثالی که زدید میگه هر وقت تابع kiloToGeram (double x ) فراخوانی شد کلاس convertClass را صدا بزن و مقدار دوبل وارد شده را به اون کلاس بفرست که در کلاس convertClass حتما یک تابع به همین اسم وجود داره.
در واقع با این کار داریم از دو کلاس همزمان استفاده میکنیم و کلاس پدر هم مقدار دهی میکنیم.
امیدوارم توضیحاتم مفید بوده باشه

omid_kma
یک شنبه 06 مهر 1393, 10:46 صبح
توی این خط :

kiloToGeram (double x ) : public convertClass (x) { };

کلمه public اضافی هست
ضمنا به این روش delegating constructo (http://www.7khatcode.com/2832/%D9%81%D8%B1%D8%A7%D8%AE%D9%88%D8%A7%D9%86%DB%8C-%D8%B3%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D8%A7%D8%B2-%D8%B3%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D8%AF%DB%8C%DA%AF%D8%B1)rمیگن.

rahnema1
یک شنبه 06 مهر 1393, 20:32 عصر
ضمنا به این روش delegating constructo (http://www.7khatcode.com/2832/%D9%81%D8%B1%D8%A7%D8%AE%D9%88%D8%A7%D9%86%DB%8C-%D8%B3%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D8%A7%D8%B2-%D8%B3%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D8%AF%DB%8C%DA%AF%D8%B1)rمیگن.

delegating constructor در مورد وقتی هست که هدف ما سازنده دیگری از همون کلاس باشه نه کلاس پدر

fahimeh1512
شنبه 19 مهر 1393, 14:37 عصر
delegating constructor در مورد وقتی هست که هدف ما سازنده دیگری از همون کلاس باشه نه کلاس پدر
خب بالاخره public اضافیه یا میتونه به این شکل نوشته بشه؟؟

rahnema1
شنبه 19 مهر 1393, 15:20 عصر
خب بالاخره public اضافیه یا میتونه به این شکل نوشته بشه؟؟

public اضافیه
ببینید هنگامی که داریم سازنده یک کلاس را تعریف می کنیم میتونیم هم عضو کلاس و هم پدر کلاس را مقدار دهی اولیه کنیم .
و همون طور که قبلا گفته شد میشه بعد از : یک سازنده دیگه از همون کلاس را صدا زد که بهش delegating constructor میگن


#include <iostream>
using namespace std;
struct pedar {
string ozv_pedar;
pedar(string s):ozv_pedar(s){}
pedar(){};
};
struct farzand: pedar{
int ozv_farzand;
farzand (int val):ozv_farzand(val){}
farzand (string mystring):pedar(mystring){}
farzand (int val,string mystring):ozv_farzand(val),pedar(mystring){}
};
int main()
{
farzand f(5);
cout<<f.ozv_farzand<<endl;
farzand f1(8,"reshte");
cout<<f1.ozv_pedar<<endl;;
farzand f2("reshte2");
cout<<f2.ozv_pedar;
}

fahimeh1512
یک شنبه 20 مهر 1393, 08:26 صبح
public اضافیه
ببینید هنگامی که داریم سازنده یک کلاس را تعریف می کنیم میتونیم هم عضو کلاس و هم پدر کلاس را مقدار دهی اولیه کنیم .
و همون طور که قبلا گفته شد میشه بعد از : یک سازنده دیگه از همون کلاس را صدا زد که بهش delegating constructor میگن


#include <iostream>
using namespace std;
struct pedar {
string ozv_pedar;
pedar(string s):ozv_pedar(s){}
pedar(){};
};
struct farzand: pedar{
int ozv_farzand;
farzand (int val):ozv_farzand(val){}
farzand (string mystring):pedar(mystring){}
farzand (int val,string mystring):ozv_farzand(val),pedar(mystring){}
};
int main()
{
farzand f(5);
cout<<f.ozv_farzand<<endl;
farzand f1(8,"reshte");
cout<<f1.ozv_pedar<<endl;;
farzand f2("reshte2");
cout<<f2.ozv_pedar;
}

ممنون بابت مثال خوبتون
کاملا شفاف سازی شد واسم
فقط یه سوال: شما به جای کلاس استراکچر تعریف کردید واقعا استراکچر هم میتونه اینجوری استفاده بشه یا اشتباه کردید؟

rahnema1
یک شنبه 20 مهر 1393, 10:23 صبح
ممنون بابت مثال خوبتون
کاملا شفاف سازی شد واسم
فقط یه سوال: شما به جای کلاس استراکچر تعریف کردید واقعا استراکچر هم میتونه اینجوری استفاده بشه یا اشتباه کردید؟

struct توی ++c همون کلاسه با این تفاوت اصلی که اعضای یک کلاس که با کلمه struct تعریف شده به طور پیش فرض pulic هستند بر خلاف کلاسهایی که با کلمه class تعریف می شوند که به طور پیشفرض اعضای اون private هستند. همچنین در ارث بری هم اگر من یک کلاس باشم که با کلمه struct تعریف می شوم و می خواهم از یک کلاس دیگه ارث ببرم (اگر هنگام ارث بردن از هیچ کلمه ای مانند pulic یا private استفاده نکنم) اون کلاس ارث دهنده عضو public من می شود
در زمینه تفاوت بین struct در c و ++c و سازگاری کدهای نوشته شده جهت استفاده از این دو هم نکاتی هست که در قسمت ضمیمه استاندارد ++c یعنی در قسمت Annex C به اون اشاره شده