View Full Version : سوال: دو متغیر با یک اسم در تو کلاس متفاوت و گرفتن error
ravaei
سه شنبه 04 فروردین 1394, 07:59 صبح
یه سوال که منو خیلی اذیت میکنه اینه که چرا من وقتی دو تا کلاس متفاوت دارم تو هر کودوم مثلا یه متغیر به نام name تعریف می کنم گیر میده ...
آیا اصلا اصولیه که من تو فایل .cpp متغیر هام رو تعریف کنم؟؟ یا اینکه بسته به سطح دسترسیش تو .h ؟؟
negative60
سه شنبه 04 فروردین 1394, 08:35 صبح
خوب وقتی تو سورس کلاس متغير تعريف ميکنيد به صورت عمومی تعريف ميشه و عضوی از کلاس به حساب نمياد شما ميبايست تو هدر کلاس متغير رو تعرف کنيد.
پيشنهاد ميکنم اگه قبلاً ++c کار نکرديد و يکباره از #c به Qt کوچ کرديد يک کتاب ++c بخونيد که درک کاملی به دست بياريد.
ravaei
سه شنبه 04 فروردین 1394, 10:08 صبح
خوب وقتی تو سورس کلاس متغير تعريف ميکنيد به صورت عمومی تعريف ميشه و عضوی از کلاس به حساب نمياد شما ميبايست تو هدر کلاس متغير رو تعرف کنيد.
پيشنهاد ميکنم اگه قبلاً ++c کار نکرديد و يکباره از #c به Qt کوچ کرديد يک کتاب ++c بخونيد که درک کاملی به دست بياريد.
ممنون از توضیحات ، بله دقیقا مشکل من همینه اوایل اون کارو می کردم ولی یه syntax رو رو مطالعه کردن وقتی یه زبان بلدی خسته کنندست سعی می کنم هرجا مشکل داشته باشم پیداش کنم ... دسته شما هم درد نکنه با کمکاتون :لبخندساده:
chikar
سه شنبه 04 فروردین 1394, 13:52 عصر
یه سوال که منو خیلی اذیت میکنه اینه که چرا من وقتی دو تا کلاس متفاوت دارم تو هر کودوم مثلا یه متغیر به نام name تعریف می کنم گیر میده ...
آیا اصلا اصولیه که من تو فایل .cpp متغیر هام رو تعریف کنم؟؟ یا اینکه بسته به سطح دسترسیش تو .h ؟؟
سلام، بهتر بود این سوال رو تو تالار cpp می کردید
احتمالا شما تصور می کنید اگر یک فایل به نام ravaei.h داشته باشید، فایل متناظر ravaei.cpp یعنی فضای کلاس. نه یک فایل cPP. یا .h می تونه توابع و چندین کلاس مختلف رو در خودش داشته باشه، زمانی که تو فایل cpp. دارید کار می کنید یعنی یک فضای نام سراسری و اگر بخواهید از یک کلاس خاص استفاده کنید می تونید تابعی رو که هدرش هم include شده پیاده سازی کنید مثلا
void myclass::funck() {} الان درون این تابع فقط مربوط به کلاس myclass هست و خارج از اون یعنی فضای سراسری
شما تو یه فایل .h یا یک فایل cpp. می تونید چندین کلاس داشته باشید، و روش معمول تر هم این هست که می تونید همه اعلان های هر چند تا کلاس رو تو یه فایل .h بگذارید و پیاده سازی اون کلاس ها رو هم درون یک فایل cpp. انجام بدید
به این مثال توجه کنید
int x;
class myclass1{
int x;
myclass1() {};
void funck();
};
class myclass2{
int x ;
myclass2() {};
};
در اینجا ما سه تا x داریم، ، که کاملا با هم تفاوت دارند، یکی مربوط به فضای نام سراسری که به همراه extern در تمام پرژه(نه تو اون فایلی که تعریف شده، همه جا) قابل استفاده است، یک عضو اختصاصی x که مخصوص کلاس myclass1 هست و یک عضو اختصاصی x هم که مربوط به myclass2 هست(این دو x فقط در کلاس هاشون قابل استفاده اند)
این کلاس ها رو تو هر فایلی می تونید اعلان و تعریف کنید حتی فایلی که تابع main تو اون قرار داره.
ravaei
سه شنبه 04 فروردین 1394, 15:16 عصر
ممنون از توضیحات خیلی خوب بود ...
فقط یه چیز برام گنگ شد الان اون int x که شما بیرون از دوتا کلاس تعریف کردید ، آیا مثل این میمونه که تو main.cpp یک متغیر به نام x تعریف کنیم و بعد دو تا هم کلاس myclass1 و myclass2 داشته باشیم ... آیا به x تو هر دو تا کلاسمون دسترسی داریم؟؟
chikar
سه شنبه 04 فروردین 1394, 17:17 عصر
ممنون از توضیحات خیلی خوب بود ...
فقط یه چیز برام گنگ شد الان اون int x که شما بیرون از دوتا کلاس تعریف کردید ، آیا مثل این میمونه که تو main.cpp یک متغیر به نام x تعریف کنیم و بعد دو تا هم کلاس myclass1 و myclass2 داشته باشیم ... آیا به x تو هر دو تا کلاسمون دسترسی داریم؟؟
تو هر فایلی می شه به صورت سراسری اعلانش کرد مثلا تو همون فایل .cpp که main هست ولی نه در تابع main،بلکه بیرون از اون به صورت سراسری،
بله به هر دو تا x تو کلاس خودشون دسترسی خواهید داشت
یه مثال می زنم بهتر متوجه شوید
class myclass1{
int x;//x of myclass1
public:
myclass1() {};
void funck() {this->x = 9;
std::cout << "\n x in myclass1 is: " << this->x;};
};
class myclass2{
int x ;//x of myclass2
public:
myclass2() {x=0;};
int funck();
};
int x = 124;// x is global
int main()
{
std::cout << "\n global x is: " <<x;
myclass1 c;
c.funck();
myclass2 c2;
std::cout << "\n x in myclass2 is: " << c2.funck();
++x;
std::cout << "\n global x is: " <<x;
return 0;
}
int myclass2::funck()
{
x=2;
return x;
}
output is:
global x is: 124
x in myclass1 is: 9
x in myclass2 is: 2
global x is: 125
تابع funck در myclass1 رو داخل خود کلاس پیاده سازی کردیم، ولی تابع funck در myclass2 رو خارج از کلاسش پیاده سازی کردیم، متغیر سراسری x می بینید که تغییرات کلاس ها روی اون اثری نداره و هر x از کلاس هم قابل استفاده فقط در همون کلاس هست
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.