PDA

View Full Version : سوالی ساده در مورد class ها در c++



nazi73
شنبه 02 آذر 1392, 18:20 عصر
سلام

دوستان می خواستم بدونم اگه مثلا ما یه نمونه از کلاس ایجاد کنیم و بعد اون نمونه رو به عنوان ورودی به هر یک از توابع موجود در کلاس بدیم درسته؟؟

مثلا این کد رو در نظر بگیرید:


class stack
{
node *sp;
public:
stack();
int isempty(stack &);
void push(stack &);
void pop(stack &);
void display(stack &);
};
stack s;

و اگه درسته میشه یه کم در موردش توضیح بدین که یعنی چی و این حرفا؟

می دونم سوالم ساده هست ولی خب دیگه چیکار کنم من تقریبا تازه کارم و برام سوال شده دیگه :ناراحت:

ممنون میشم راهنماییم کنید...

با تشکر (البته پیشاپیش)

nazi73
شنبه 02 آذر 1392, 18:39 عصر
می خوام بدونم که اصلا لازم هست این کار؟

اگه این کار رو انجام بدیم چی میشه؟؟ با حالتی که این کار رو نکنیم فرقی داره؟

آخه من هر دو حالت رو امتحان کردم و هر دو هم جواب درست تحویلم دادن!!

Vitallity
شنبه 02 آذر 1392, 20:25 عصر
مثلا ما یه نمونه از کلاس ایجاد کنیم و بعد اون نمونه رو به عنوان ورودی به هر یک از توابع موجود در کلاس بدیم درسته؟
نه لازم نیست همچین کاری کنی. این کدی که گذاشتی فقط برای فایل header هست. پیاده سازی این کلاس توی فایل source انجام می‌شه اگر اون رو ببینی متوجه می‌شی کاربرد آرگومان‌های هر تابع برای چی هست. مثلاً پیاده سازی void display(stack &); می‌توه با این شکل باشه:

void stack::display(stack & s)
{
for(auto i: s->node)
{
std::cout << i << ", ";
}
}



می خوام بدونم که اصلا لازم هست این کار؟
هم آره و هم نه؛ بسته به نحوه پیاده‌سازی خودت داره.


اگه این کار رو انجام بدیم چی میشه؟؟ با حالتی که این کار رو نکنیم فرقی داره؟
بله فرق می‌کنه.

در ضمن مفهوم & و * رو می‌دونی؟ و می‌تونی یک قسمت از اون کد رو به فارسی توضیح بدی؟

nazi73
شنبه 02 آذر 1392, 20:33 عصر
خیلی ممنون (فکر کنم از * وقتی استفاده می کنیم که یه اشاره گر رو تعریف کنیم و & رو وقتی استفاده می کنیم که بخوایم مقدارشو نشون بدیم ).

راستش میشه این تفاوتی که میگید رو یه کم بیشتر باز کنید؟ واقعا مفهوم این قسمتشو رو نمی فهمم من قراره یه پروژه ای بنویسم که پشته پویا رو پیاده سازی کنه. برنامه ی که من نوشتم شی رو به عنوان ورودی به هیچ کدوم از این توابع نمیده و البته اجراش هم کاملا درسته و مشکلی نداره.(یعنی این که تابع ها هیچ ورودی ندارند)

این که شی رو به عنوان ورودی به هر یک از توابع بفرستیم چیزیه که استادمون تو جزوش گفته و من واقعا نمی فهمم این کار چه لزومی داره.

وقتی بدون این که این عمل رو انجام بدیم میشه برنامه رو پیاده سازی کرد و به طور کامل اجراش هم درسته، پس دیگه چه لزومی داره این کار رو انجام بدیم؟؟

در واقع من می خوام بدونم فرق این دو حالت چیه؟

در ضمن من خودم فقط قسمت هدرشو گذاشتم. هر کدوم از تابع ها تو برنامه ای که نوشتم تعریف شدن. من اون قسمت رو گذاشتم تا منظورمو برسونم

Vitallity
یک شنبه 03 آذر 1392, 13:30 عصر
فکر کنم از * وقتی استفاده می کنیم که یه اشاره گر رو تعریف کنیم و & رو وقتی استفاده می کنیم که بخوایم مقدارشو نشون بدیم

درسته، * برای ایجاد یک اشاره‌گر هست که آدرس یک متغیر در حافظه رو نشون می‌ده. وقتی از & استفاده می‌کنیم برای این هست که یک متغیر با نام دیگه ایجاد کنیم که به یک شی توی حافظه اشاره کنه(خیلی شبیه به همون *) با این کار میشه یک یا چند نام از یک آبجکت ایجاد کرد.


... برنامه ی که من نوشتم شی رو به عنوان ورودی به هیچ کدوم از این توابع نمیده و البته اجراش هم کاملا درسته و مشکلی نداره.(یعنی این که تابع ها هیچ ورودی ندارند)
هیچ ایرادی نداره و دلیلی هم نداره حتماً مثل جزوه برنامه بنویسی!


این که شی رو به عنوان ورودی به هر یک از توابع بفرستیم چیزیه که استادمون تو جزوش گفته و من واقعا نمی فهمم این کار چه لزومی داره.
لزومی نداره، بستگی به نیازت توی برنامه‌ای که می‌نویسی داره. توی برنامه نویسی اگر یک موضوع رو به 5 تا برنامه‌نویس بدی ممکنه به 5 روش اون برنامه رو بنویسند مهم اینه که بفهمی ساختار و نحوه عملکرد ابزاری که در دست داری چیه.



در واقع من می خوام بدونم فرق این دو حالت چیه؟

توی C++ می‌تونی یک تابع رو overload کنی. یعنی یک تابع با یک نام رو دوباره بنویسی ولی نوع پارامتر دریافتی‌ش متفاوت باشه... مثلاً void push(stack &); رو تعریف میکنی برای این که محتویات یه استک دیگه رو به استکی که داری اضافه کنی و void push(int); رو تعریف می‌کنی برای این که فقط یه عدد رو به است اضافه کنی. خب حالا که توی کتابخونه‌ات این دو تا رو تعریف کردی اگر بنویسی

stack s1;
stack s2;

s1.push(10);

s2.push(3);

s1.push(s2);

توی این حالت زمانی که داریم به s1 مقدار 10 رو اضاقه(push) می‌کنیم تابع void push(int); صدا زده میشه و وقتی می‌نویسیمs1.push(s2); تابع void push(stack &); صدا زده میشه.