PDA

View Full Version : سوال: چاپ یک شی از کلاس



Marjan_Bala
چهارشنبه 25 آذر 1388, 22:56 عصر
سلام دوستان ، یه سوالی برام پیش اومده که دوباره دست به دامنتون شدم:
چه طور می‌توان امکان چاپ یک شئ به وسیله cout را برای اشیائی از نوع یک کلاس دلخواه را فراهم کرد؟
مثلا:


class Vector
{
public:
Vector(int,int);
int m,n;
};
void main()
{
Vector v1(1,1);
cout<<v1;
}



میخوام وقتی دستور cout اجرا شد خروجی مثلا به شکل زیر بشه:

x: 1 y: 1
فکر کنم برای اینکار باید operator<< رو overload کنم ،ولی چجوری باید اینکارو کنم یعنی نوع خروجیشو چی باید بگیرم؟
اصلا خود c++ امکاناتی برای انجام اینکار نداره؟
ممنون میشم اگه کمک کنید.

clover
چهارشنبه 25 آذر 1388, 23:50 عصر
همونطور که گفتید باید عملگر درج در جریان را برای کلاس خودتون سربار گذاری کنید . چون عملوند سمت راست این عملگر از نوع & ostream هست بنابر این عملگر باید به عنوان یک تابع سراسری و دوست کلاس شما تعریف شود (البته در اینجا چون m و n سراسری هستند نیازی به تعریف تابع به صورت دوست نیست. اما در حالت کلی به این شکل عمل می شود). به این شکل :

class Vector
{
friend ostream &operator<<(ostream &, const Vector &);
public:
Vector(int,int);
int m,n;
};

ostream &operator<<(ostream &output, const Vector &rVector)
{
output << "x: " << rVector.m << "y: " << rVector.n;
return output;
}

void main()
{
Vector v1(1,1);
cout<<v1;
}

نوع بازگشتی این تابع می تواند void باشد. در اینجا نوع بازگشتی & ostream هست تا بتونیم از اپراتور به این شکل هم استفاده کنیم:

cout << Vector1 << Vector2 << Vector3;

موفق باشید.

Marjan_Bala
پنج شنبه 26 آذر 1388, 13:01 عصر
دوست عزیز clover ممنون از پاسختون ، برنامتون جواب میده ، دقیقا همون کاریو میکنه که میخواستم.
فقط اینکه فرمودید نوع بازگشتی این تابع می تواند void باشد ، وقتی من void میذارمش Error میده اگه void بگیریم که دیگه هیچی نباید return کنیم، آخه تاحالا خروجیمو &ostream تعریف نکردم یعنی با این نوع آشنایی ندارم. اونوقت این پارامتر output چیکار میکنه؟
ممنون میشم اگه یه کوچولو توضیح بدین.

Marjan_Bala
پنج شنبه 26 آذر 1388, 13:05 عصر
یک تابع بساز برای پرینت

class vector
{
public:
void print();
.
.
.
}
void vector::print()
{
cout<<m<<n;
}
.
.
.
main()
{
vector v1(4,6);
v1.print();
.
.
.
}

دوست عزیز ظاهرا شما درست متوجه منظور من نشدین ، من میخوام وقتی میزنم cout<<v1 متغیرای این شیو پرینت کنه نه اینکه بزنم v1.print بعد پرینت کنه خب اونجوری که کاری نداره!

clover
پنج شنبه 26 آذر 1388, 19:36 عصر
وقتی من void میذارمش Error میده
لطف کنید کد ها را هم بذارید تا بهتر بشه راهنمایی کرد.


اونوقت این پارامتر output چیکار میکنه؟
اگر دقت کنید تابع >>operator دو پارامتر دریافت می کنه، پارامتر دوم از نوع & const Vector که یک نوع ارجاعی از کلاس شما هست (در تابع از این پارامتر برای دسترسی به کلاس مورد نظر استفاده می شود) به همین صورت شما نیاز به دسترسی به cin هم دارید (cin یک شی از کلاس ostream هست) پس باید cin را هم به صورت یک پارامتر به تابع ارسال کنید. در موقع فراخوانی تابع >>operator کامپایلر به صورت اتوماتیک عملوند سمت چپ ( در اینجا cin ) را به عنوان پارامتر اول و عملوند سمت راست (در اینجا شی از کلاس Vector) را به عنوان پارامتر دوم به تابع ارسال می کنه و ما در تابع ، از این اشیا با نام های output و rVector استفاده می کنیم. پس output همان cin هست ولی با نامی دیگر.

Marjan_Bala
شنبه 28 آذر 1388, 14:01 عصر
اگر دقت کنید تابع >>operator دو پارامتر دریافت می کنه، پارامتر دوم از نوع & const Vector که یک نوع ارجاعی از کلاس شما هست (در تابع از این پارامتر برای دسترسی به کلاس مورد نظر استفاده می شود) به همین صورت شما نیاز به دسترسی به cin هم دارید (cin یک شی از کلاس ostream هست) پس باید cin را هم به صورت یک پارامتر به تابع ارسال کنید. در موقع فراخوانی تابع >>operator کامپایلر به صورت اتوماتیک عملوند سمت چپ ( در اینجا cin ) را به عنوان پارامتر اول و عملوند سمت راست (در اینجا شی از کلاس Vector) را به عنوان پارامتر دوم به تابع ارسال می کنه و ما در تابع ، از این اشیا با نام های output و rVector استفاده می کنیم. پس output همان cin هست ولی با نامی دیگر.

ممنون دوست عزیز ، بله همونطور که فرمودید میشه خروجیشو void گذاشت که فکر کنم کار جالبی نباشه ، من عملگر << هم سربارگذاری کردم و برنامه به این شکل شد:


#include <iostream>
#include <ostream>
using namespace std;
class Vector
{
private:
friend ostream& operator<<(ostream&, const Vector&);
friend istream& operator>>(istream&, Vector& );
public:
Vector(int,int);
int m,n;
};
istream& operator>>(istream& input, Vector& rVector)
{
cout<<"Enter a number for m:";
input>>rVector .m;
cout<<"Enter a number for n:";
input>>rVector .n ;
return input;
}
ostream& operator<<(ostream& output, const Vector& rVector)
{
output << "x:" << rVector.m << " y:" << rVector.n<<endl;
return output;
}
Vector::Vector(int i, int j)
{
m=i;
n=j;
}
void main()
{
Vector v1(10,20);
cout<<v1 ;
cin>>v1;
cout<<v1;
}