PDA

View Full Version : تعریف 2 پارامتر برای سازنده (constructor) کلاس؟ [++C]



ProgramYL
شنبه 14 تیر 1393, 15:23 عصر
سلام.
می خواهم بدانم چگونه کدی بنویسم که یک سازنده دو آرگومان (مقدار رشته ای اولیه از اشیاء را دریافت کند) را از طریق اشیاء دریافت کند و در توابع قرار دهد. که از طریق آن توابع کلاس بتوانم مقدار های دریافت شده را در داده های عضو کلاس قرار دهم.

parvizwpf
شنبه 14 تیر 1393, 16:14 عصر
class MyClass
{
private:
int _arg1=0;
int _arg2=0;
public:
MyClass(int arg1,int arg2)
{
_arg1=arg1;
_arg2=arg2;
}
}

ProgramYL
شنبه 14 تیر 1393, 17:30 عصر
@parvizwpf (http://barnamenevis.org/member.php?243106-parvizwpf)
متشکرم.
شاید من متوجه نمی شم. می خوام دو مقدار رشته ای رو به عنوان مقدار پیش فرض برای اشیاءی که ایجاد کردم در نظر بگیرم، که این دو مقدار اولیه از طریق سازنده مقدار دهی میشه. مثلا:

class MyClass
{
public:
MyClass(int newvalue)
{
...
}

private:
int dataMember;
};


int main()
{
MyClass objectOfClass(10000)
...
}

اما من نمی دونم چطور باید مقدار اولیه اشیايی که ایجاد می کنم در دو پارامتر سازنده قرار بگیره. یعنی ترتیب مقدار دادن به اشیاء رو نمی دونم.
ببخشید اگه خوب نمی تونم منظورم برسونم.

parvizwpf
شنبه 14 تیر 1393, 18:21 عصر
خب شما هر مفداری رو میخواهید برای اعضای کلاس ست بشه داخل همون سازنده بنویسید. هنگامی که در مین اونرور میسازید این مقادیر هم اعمال میسوند مثل اون که من نوشتم. مثلا داخل سازنده میتونید بنویسید:
dataMember = newvalue;

hosseinam1370
شنبه 14 تیر 1393, 18:33 عصر
با سلام.
اصلا چرا باید سازنده داشته باشیم؟
چقدر مهمه داشتن این سازنده؟
از اونور مخرب هم همینطور.
اینا به چکاری میآن؟

تشکر

ProgramYL
شنبه 14 تیر 1393, 18:37 عصر
ممنون parvizwpf (http://barnamenevis.org/member.php?243106-parvizwpf)
منظورم اینه که فرض می کنم دو تا شئ ایجاد کردم که دارای مقدار هستند:

int main()

{

MyClass objectOfClass(10000)
MyClass objectOfClass(11111)

...
}

این دو مقدار چطور باید در دو پارامتر سازنده قرار بگیره. به این صورت که پارامتر newvalue مقدار 10000 بگیره و پارامتر دوم newvaluetwo مقدار 11111
من نمی خوام از طریق تابع یک کلاس به داده عضو کلاس مقدار بدم، می خوام از طریق آرگومان این دو شئ به متغیرهای سازنده (newvalue, newvaluetwo) مقدار بدم.





آیا سازنده ها فقط برای مقدار دادن یا گرفتن از اشیاء (شئ ایجاد شده از کلاس) کاربرد دارند؟ (نمی دانم سازنده ها مقدار می دهند به اشیاء یا می گیرند! (در کتاب نوشته شده می دهند، اما انگار می گیرند!!))
آیا میشه از طریق یک تابع عضو کلاس مقدار یک سازنده رو تغییر داد؟ در این صورت فایده اش چیه؟ چون تا قسمتی از کتابی که می خوانم نوشته شده برای دادن مقدار اولیه به شئ به کار می رود.

وقتی یک مقدار عددی را به عنوان مقدار پیش فرض کلاس در نظر می گیرم و به سازنده میدم (سازنده از نوع int)، و از طریق بدنه تابع مقدار رو در یک داده عضو کلاس قرار می دم، و بعد توسط یک تابع (مثال زیر) return میکنم، چیزی نمایش داده نمیشه (اما در مورد مقدار رشته ای اینطور نیست)، چرا؟ مشکل کد کجاست؟

#include <iostream>
using namespace std;

class MyClass
{
public:
MyClass(int par1)
{
dataMember=par1;
}

int getACC()
{
return dataMember;
}

private:
int dataMember;

};

int main()
{
MyClass newObject(10000);
newObject.getACC();
};

parvizwpf
شنبه 14 تیر 1393, 21:02 عصر
شما وقتی میخواهید هنگام ساخت یک آبجکت ، مقداری یا تنظیماتی اولیه به اون اختصاص بدید، از سازنده استفاده میکنید. وقتی شما مثلا 1111111 رو پاس میدید ، خوب من دارم میگم شما توی سازنده اون مقدار داخلی کلاس رو بنام dataMember میتونید مقدار دهی کنید. خب از اینجا به بعد شما در اون کلاس متغیر dataMember با مقدار 111111 دارید حالا باید کارهای بعدی رو با توابع و ... انجام بدید.

newObject.getACC();
خب این دستور اصلا خروجی نداره.
cout<<newObject.getACC();

ProgramYL
شنبه 14 تیر 1393, 21:51 عصر
خیلی حوصله کردی parvizwpf (http://barnamenevis.org/member.php?243106-parvizwpf) عزیز.
تازه موضوع رو گرفتم :لبخند:. خیلی خیلی متشکرم.


#include <iostream>
using namespace std;

class MyClass
{
public:
MyClass(int par1, int par2)
{
dataMember=par1;
dataMemberTwo=par2;
}

int getAccA()
{
return dataMember;
}

int getAccB()
{
return dataMemberTwo;
}

private:
int dataMember;
int dataMemberTwo;
};

int main()
{
MyClass newObject(10000,20000);
MyClass newObjectTwo(30000,40000);
cout << newObject.getAccA() << endl;
cout << newObject.getAccB() << endl;
cout << newObjectTwo.getAccA() << endl;
cout << newObjectTwo.getAccB();
};

a.r.khoshghalb
یک شنبه 15 تیر 1393, 01:26 صبح
با سلام.
اصلا چرا باید سازنده داشته باشیم؟
چقدر مهمه داشتن این سازنده؟
از اونور مخرب هم همینطور.
اینا به چکاری میآن؟

تشکر

از برجسته ترین کاربرد های توابع سازنده همین داستان مقدار دهی به متغیر هاست که کاربرد های زیادی داره!
یکیش تمیز بودن و کوتاه تر بودن کده! برای مثال! شما یه کلاس داری :

class Barnamenvis{
string lang;
int age;
public:
Barnamenevis(string s, int a)
{
lang = s;
age = a;
}
}


و یه تابع داری که ورودیش این کلاس است:


void estekhdam(Barnamenevis karmand)
{
...
//SOME CODE FOR ESTEKHDAM
...
}


شما بدون تابع سازنده باید بیای هر بار که می خوای به این تابع ورودی بده یه دونه متغیر از جنس Barnamenevis بسازی، به تک تک پارامتر ها مقدار بدی بعد اون رو بدی به تابع :

Barnamenevis A;
A.age = 30;
A.lang = "CPLusPlus";
estekhdam(A);


اما به کمک توابع سازنده :

estekhdam(Barnamenevis(30,"CPlusPlus"));


این صرفا یک مثال بود برای درک بهتر مثال های زیادی وجود داره، مثال دیگر در ارث بری کلاس هاست...
در کل پدیده کاربردی هست و قطعا در برنامه نویسی مشاهده خواهی کرد کاربرد هاش رو!

توابع مخرب یا destructor هم که اصلی ترین کاربردشون حافظه است! اگر تا حالا برنامه بزرگی نوشته باشی که توش با مقدار زیادی داده سر و کار داری (حتی اگر از حافظه heap استفاده کنی) می بینی که نگه داشتن این همه داده و وجود این همه متغیر بسیار باعث افت سرعت برنامه میشه و در مواردی برنامه توسط سیستم عامل کشته میشه! این داستان توی برنامه نویسی موبایل خیلی به چشم میاد به دلیل رم کمتر...
مثال:
بازی doodle jump رو که حتما دیدی. بازی یه شخصیت داره که میپره رو یه سری پله مانند و میره بالا!
خوب اینطوریه که بعد هر پرش که یه پله از پایین صفحه خارج میشه یه پله از بالای صفحه وارد میشه (میتونی همون پله ای که رفت بیرون رو دوباره بیاری بالا ولی خوب این صرفا مثاله و ما حالت بد رو در نظر می گیریم که هر دفعه پله میسازی)
تو بازی شاید بیشتر از 1000 پله ساخته میشه و این باعث میشه سرعت بازی بسیار زیاد کم بشه! بسیار زیاد! (تجربه این قضیه رو داشتم واسه موبایل، شما هم تجربه کن که بهتر متوجه شی)
خوب حالا راه حل چیه؟ باید هر پله ای که از پایین میره بیرون رو حذف کنی از حافظه و بعد پله جدید بسازی
خود CPlusPlus دستور delete داره اما شاید شما بخوای با اطلاعات پله در حال حذف کاری انجام بدی! مثلا شاید بخوای وقتی یه پله حذف میشه به مقدار یک متغیر یکی اضافه کنی یا از این دست کار ها! قطعا خودت اگر فکر کنی به مثال های خیلی بهتری از بازی doodle jump میرسی
امیدوارم متوجه شده باشی آن چه را می خواستم متوجه شی!!
:لبخندساده:

hosseinam1370
یک شنبه 15 تیر 1393, 01:46 صبح
ممنون دوسته گرامی.فهمیدم.