PDA

View Full Version : سوال: مشکل با کلاس ++C



mk3000
پنج شنبه 20 اسفند 1394, 04:50 صبح
سلام دوستان.
میشه بگید چرا نمیتونم متغیری رو از یک کلاس توی تابع تغییر بدم؟



#include <iostream>


using namespace std;


class myClass
{


public:
int class_a;


};


void change (myClass x, int void_a)
{


x.class_a = void_a;


}


int main()
{


myClass one;
change (one, 2);
cout << one.class_a;


return 0;


}


الآن میخوام که one.class_a بشه 2 ولی هیچ تغییری نمیکنه

md3848
پنج شنبه 20 اسفند 1394, 08:58 صبح
سلام
یه راه حل ساده : کلاست رو سراسری(خارج از تابع Main) تعریف کن
برا راه حل دیگه هم میگردم و مطالعه میکنم و فهمیدم میام اینجا بهت میگم.:لبخند:


خواستم بگم :خوش امدید به سایت برنامه نویس:قلب:
بعد دیدم شما زود تر از من تو سایت برنامه نویس عضو شدید:قهقهه: >>> آخه من تعداد پست ها رو که دیدم نوشته بود1 >>>> در هر صورت بگذریم:لبخند:

md3848
پنج شنبه 20 اسفند 1394, 09:49 صبح
خب یه راه دیگه هم مثل این که وجود داره و اونم ساخت اشاره گری برا اشیا:لبخند:
که میایم آدرس شی رو میفرستیم و نه خود شی رو:قهقهه: (کلا این اشاره گر ها خیلی باحال هستن:تشویق:)

این یه برنامه >>> برنامه و روش های دیگه هم انشاالله اگه تونستیم به زودی میزارم:لبخند:

#include <iostream>
using namespace std;


class myClass
{
public:
/*
اگه پارامتري به اين تابع نديم، اين تابع به
تابع سازنده پيشفرض اين کلاس تبديل ميشه
*/
myClass(int Value = 0){Number = Value;}
//myClass(const myClass& r){Number = r.Number;}
//~myClass(){}


void change(int Value){Number = Value;}
int Number;
};


void FunctionTest(myClass *POMC, int);


int main(){
// تغيير توسط تابع سازنده کلاس
myClass *PO_MyClass = new myClass(0);
cout << (*PO_MyClass).Number << "\n";

// تغيير در اينجا
(*PO_MyClass).Number = 1;
cout << (*PO_MyClass).Number << "\n";


// تغيير توسط يکي از توابع داخل خود کلاس
(*PO_MyClass).change(2);
cout << (*PO_MyClass).Number << "\n";


// تغيير توسط تابع تعريف شده توسط خودمون در اين فايل
FunctionTest(PO_MyClass, 3);
cout << (*PO_MyClass).Number << "\n";


while(1);
}


void FunctionTest(myClass *POMC, int Value)
{
(*POMC).Number = Value;
cout << (*POMC).Number << ", ";
}

md3848
پنج شنبه 20 اسفند 1394, 10:14 صبح
اینم همون برنامه بالا فقط دیگه تو کل برنامه از آدرس شی استفاده نمیکنم و فقط در جاهای ظرروری --راستی احساس میکنم این سایت برنامه نویس کند شده؟ مگه نه؟

#include <iostream>using namespace std;


class myClass
{
public:
/*
اگه پارامتري به اين تابع نديم، اين تابع به
تابع سازنده پيشفرض اين کلاس تبديل ميشه
*/
myClass(int Value = 0){Number = Value;}
//myClass(const myClass& r){Number = r.Number;}
//~myClass(){}


void change(int Value){Number = Value;}
int Number;
};


void FunctionTest(myClass *POMC, int);


int main(){
// تغيير توسط تابع سازنده کلاس
myClass Obj(0);
cout << Obj.Number << "\n";


// تغيير در اينجا
Obj.Number = 1;
cout << Obj.Number << "\n";


// تغيير توسط يکي از توابع داخل خود کلاس
Obj.change(2);
cout << Obj.Number << "\n";


// تغيير توسط تابع تعريف شده توسط خودمون در اين فايل
myClass *PO_MyClass = &Obj;
FunctionTest(PO_MyClass, 3);
cout << (*PO_MyClass).Number << "\n";


while(1);
}


void FunctionTest(myClass *POMC, int Value)
{
(*POMC).Number = Value;
cout << (*POMC).Number << ", ";
}

md3848
پنج شنبه 20 اسفند 1394, 11:48 صبح
خب مثل این که تقریبا فهمیدم مشکل از کجا آب میخوره، عکس زیر رو ببین - ولی من هر کاری کردم نتونستم یه متغییر Static داخل یه کلاس رو مقدارش رو تغییر بدم:گریه: اساتید راهنمایی کنن لطفا.
139548

radeon
پنج شنبه 20 اسفند 1394, 16:25 عصر
مبحث operator overloading رو مطالعه بفرمایید
اینم برنامه شما:

#include <iostream>
using namespace std;

class myClass
{
int firstArg, secondArg;
public:
myClass(int first, int sec)
{
firstArg = sec;
secondArg = sec;
}
friend ostream& operator<<(ostream& os, const myClass& func);
};

ostream& operator<<(ostream& os, const myClass& func)
{
os << func.firstArg <<" and "<< func.secondArg <<endl;
return os;
}

int main()
{
int one=0;
int void_a=0;
cin >> void_a;

myClass func(one, void_a);
cout << func;
}

لینک برای مطالعه:
http://pages.cs.wisc.edu/~hasti/cs368/CppTutorial/NOTES/OVERLOAD.html (http://pages.cs.wisc.edu/%7Ehasti/cs368/CppTutorial/NOTES/OVERLOAD.html)
http://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/

mk3000
جمعه 21 اسفند 1394, 09:22 صبح
سلام
md3848 و radeon عزیز واقعا دستتون درد نکنه.
مشکل حل شد

#include <iostream>


using namespace std;


class myClass
{


public:
int class_a;


};


void change (myClass &x, int void_a)
{


(&x)->class_a = void_a;


}


int main()
{




myClass one;


change (one, 6);


cout << one.class_a;


return 0;


}

zero_ox
جمعه 21 اسفند 1394, 15:49 عصر
الان این کد که بدون مشکل اجرا می شه درواقع با ارسال یک شی به تابع بصورت مقدار سازنده کپی فراخوانی میشه و چون کامپایلربصورت خودکار یه سازنده کپی پیش فرض فراخوانی می کنه برا کلاس شما کد اجرا میشه و ربطی هم به اولودینگ یا ارسال بصورت اشاره گر که دوستان گفتند نداره ؟

#include <iostream>
using namespace std;
class myClass
{
public:
int class_a;
/*myClass(int x=0){class_a=x;}*/
};
void change (myClass&x, int void_a)
{x.class_a= void_a;
}
int main()
{
myClass one;
change (one, 2);
cout << one.class_a;


return 0;
}

zero_ox
جمعه 21 اسفند 1394, 16:14 عصر
خب مثل این که تقریبا فهمیدم مشکل از کجا آب میخوره، عکس زیر رو ببین - ولی من هر کاری کردم نتونستم یه متغییر Static داخل یه کلاس رو مقدارش رو تغییر بدم:گریه: اساتید راهنمایی کنن لطفا.
139548

یعنی چی نتونستم تغییربدم کدوم متغیر استایتک رو می گی ؟ متغیر استاتیک داخل کلاس اعلان می شه بیرون کلاس مقداردهی اولیه میشه .

mk3000
جمعه 21 اسفند 1394, 16:20 عصر
سلام zero_ox ممنون.
فقط یه سوال مگه ما تو قسمت آرگومنت تابع به آدرس کلاس اشاره نمیکنیم؟ پس چرا موقع فراخوانی تابع دوباره به خود کلاس اشاره میشه نه به آدرسش و مگه نباید باگ بده؟

zero_ox
شنبه 22 اسفند 1394, 11:08 صبح
مثل اینکه پست ها دوم و سوم شما رو به اشتباه انداخته از بحث اشاره گرو آدرس کلاس واین حرفا بیاید بیرون . اگر یه خرده راجع به سازند کپی جستجو کنید متوجه می شید شما درواقع دارید یک شی رو به تابع ارسال می کنید کافیه فقط یه سازنده و مخرب به کلاستون اضافه کنید تا ببیند چه اتفاقی می افته (کامپایلر یه سازنده کپی تقریبا شبیه به اون چیزی که ما نوشتیم برای کلاس فراهم می کنه

#include <iostream>
using namespace std;
class myClass
{
public:
int class_a;
myClass(){cout<<"Default Constructor"<<endl;}
myClass(myClass &x){ cout<<"Copy Constructor"<<endl;}
~myClass(){cout<<"Destructor"<<endl;}
};
void change (myClass x, int void_a)
{
x.class_a= void_a;
cout<<"x : "<<x.class_a<<endl;
// یا ازرفرنس استفاده کنید مثل بالا یا به این صورت عمل کنید
}


int main()
{
myClass oneک
// این قسمت شما با ایجاد یک شی سازنده پیش فرض رو فراخوانی می کنید
change (one,2);
// یکی ازمواردی که سازنده کپی فراخوانی میشه ارسال یک شی به تابع با مقدارهست .
one.class_a;
return 0;
}

mohsen_nikoei
جمعه 28 اسفند 1394, 12:42 عصر
سلام ..توابعی که ارگومان میگیرن یک کپی از ارگومان میبرن داخل تابع عملیات رو رو اون انجام میدن یعنی همه عملیات روی کپی ارگومان انجام میشه و متغیر اصلی که به عنوان ارگومان فرستادی دست نخورده باقی میمونه...تو برنامه شما شی x که فرستادی به تابع کپی اون برده میشه و عملیات روش انجام میشه و وقتی شما بیرون از تابع cout کردی در واقع شی اصلی رو cout کردی که دست نخورده ست....برای اینکه عملیات روی شی اصلی انجام بشه نه کپی..شما میتونی از مرجع استفاده کنی که ادرس شی اصلی رو میفرسته به تابع بنابراین عملیات روی شی اصلی انجام میشه ...برای اینکار کافیه یه علامت & پشت x تو ارگومان تابع قرار بدی...به این صورت..

#include "stdafx.h"
#include<iostream>



using namespace std;


class myClass
{


public:
int class_a;


};


void change(myClass &x, int void_a)
{


x.class_a = void_a;


}


int main()
{


myClass one;
change(one, 2);
cout << one.class_a;


return 0;


}

zero_ox
یک شنبه 01 فروردین 1395, 14:14 عصر
سلام : اینکه رو کپی کار میشه درسته ولی اینجا مسئله ساخته شی موقت داخل تابع هست که با اتمام تابع ازبین می ره برا همینه هم باید از رفرنس استفاده باشه یا چون تابع void هست همانجا مقدارش چاپ بشه دیگه نیازی هم به رفرنس درپارامترتابع نیست فقط باعث یه فراخوانی اضافه سازنده و مخرب میشه .

smokyshadow
سه شنبه 03 فروردین 1395, 11:29 صبح
salam
bayad erja ya pointer behesho befresti
139677