توی کلاس ماتريس زير اگه متغير ها private باشند کلاس چه تغييری ميکنه و اينکه بايد توابعی اضافه بشه؟
تو تابع add اگه 2 تا ماتريس هم سايز نباشن تابع نميتونه خروجی برگردونه و خطا برميگردونه برای رفع اين مشکل بايد چيکار کرد؟
class matris
{
public:
double** data;
int rowsize,colsize;
public:matris(int row,int col)
{
data=new double[row][col];
}
public:matris add(matris m1)
{
if((rowsize!=m1.rowsize) || (colsize!=m1.colsize)
cout<<"error";
else
{
matris m3(rowsize,colsize);
for (int i=0;i<rowsize;i++)
for (int j=0;j<rowsize;j++)
{
m3.data[i][j]=data[i][j]+m1.data[i][j];
}
return m3;
}
}
}
main()
{
matris m1(3,4);
}
سلام!
این کد شما چندتا اشکال عجیب داره !
غیر از پرانتز و براکت و سمی کولون و . . . تعریف دینامیکی آرایه دو بعدی اونطوری نیست ! یعنی با تعریف دینامیک آرایه یه یعدی فرق می کنه. یه مثال :
کد:
int** var;
int m = 3;
int n = 4;
var=new int*[m];
for(int i=0;i<m;i++)
*(var+i)=new int[n];
من کد شما شما رو اصلاح کردم :
کد:
#include <iostream>
using namespace std;
class matris
{
public:
double** data;
int rowsize,colsize;
public:matris(int row,int col)
{
data=new double*[row];
for(int i=0;i<row;i++)
*(data+i)=new double[col];
}
public:matris add(matris m1)
{
if((rowsize!=m1.rowsize) || (colsize!=m1.colsize))
{
cout<<"error";
}
else
{
matris m3(rowsize,colsize);
for (int i=0;i<rowsize;i++)
{
for (int j=0;j<rowsize;j++)
{
m3.data[i][j]=data[i][j]+m1.data[i][j];
}
}
return m3;
}
}
};
int main()
{
matris m1(3,4);
return 0;
}
احتمالا این کلاس کامل نیست دیگه . . . چون اگه تابع add یه شی matris بر می گردونه پس حداقل یه اپراتور friend تساوی با تایع سازنده با پارامتر matris می خواد. اگه اینطوری نوشتی اون قسمتی هم که add ارور میده میتونی یه ماتریس با درایه های صفر بسازی جمع کنی و بعد خروجی بدی.
(۰۸-خرداد-۱۳۸۸, ۱۱:۴۳:۳۱)Sp!d3rm4n نوشته است: [ -> ]سلام!
این کد شما چندتا اشکال عجیب داره !
غیر از پرانتز و براکت و سمی کولون و . . . تعریف دینامیکی آرایه دو بعدی اونطوری نیست ! یعنی با تعریف دینامیک آرایه یه یعدی فرق می کنه. یه مثال :
احتمالا این کلاس کامل نیست دیگه . . . چون اگه تابع add یه شی matris بر می گردونه پس حداقل یه اپراتور friend تساوی با تایع سازنده با پارامتر matris می خواد. اگه اینطوری نوشتی اون قسمتی هم که add ارور میده میتونی یه ماتریس با درایه های صفر بسازی جمع کنی و بعد خروجی بدی.
درسته اين کلاس کامل نيست و در واقع توابع هم به صورت پاسکال تعريف شدن
حالا شما در مورد استفاده از متغير های private و رفع مشکل خروجی تابع add ميشه منو راهنمايی کنيد?
ببخشید ! private رو یادم رفت !
اگه متغیرها رو private تعریف کنی دیگه از بیرون کلاس نمی تونی بهشون دسترسی پیدا کنی.
اگه public باشن شما تو تابع main میتونید اینو بنویسین.
کد:
matris m1(3,4);
m1.data[1][2] = 3;
از تابع main درایه 1,2 رو برابر صفر قرار دادیم. ولی اگه private بود نمیشد این کار رو کرد و شما باید یه تابع پابلیک تو کلاس برای مقداردهی تعریف می کردید. خلاصه هرچیزی که private تعریف کنید فقط تو بلوک کلاس در دسترسه.
خروجی رو هم که گفتم. ارور بخاطر اینه که شما از دستور return استفاده نکردی. این راه حل به ذهن من میزسه.
کد:
cout<<"error";
matris m3(rowsize,colsize);
for (int i=0;i<rowsize;i++)
{
for (int j=0;j<rowsize;j++)
{
m3.data[i][j]=data[i][j]+0;
}
}
return m3;
بعید میدونم راهی باشه که تابع خروجی نده. چون توابعی که بعدش اون خروجی رو به عنوان ورودی لازم دارن به مشکل میخورن !
(۰۸-خرداد-۱۳۸۸, ۱۷:۰۷:۵۵)Sp!d3rm4n نوشته است: [ -> ]ببخشید ! private رو یادم رفت !
اگه متغیرها رو private تعریف کنی دیگه از بیرون کلاس نمی تونی بهشون دسترسی پیدا کنی.
اگه public باشن شما تو تابع main میتونید اینو بنویسین.
کد:
matris m1(3,4);
m1.data[1][2] = 3;
از تابع main درایه 1,2 رو برابر صفر قرار دادیم. ولی اگه private بود نمیشد این کار رو کرد و شما باید یه تابع پابلیک تو کلاس برای مقداردهی تعریف می کردید. خلاصه هرچیزی که private تعریف کنید فقط تو بلوک کلاس در دسترسه.
خروجی رو هم که گفتم. ارور بخاطر اینه که شما از دستور return استفاده نکردی. این راه حل به ذهن من میزسه.
بعید میدونم راهی باشه که تابع خروجی نده. چون توابعی که بعدش اون خروجی رو به عنوان ورودی لازم دارن به مشکل میخورن !
ولی من ميخوام با private تعريف کنم و توابعش رو اضافه کنم آيا امکانش هست؟
در مورد خروجی هم نميخام خروجی نده فقط ميخوام اين مشکل رو که گفتم بر طرف کنم:
"تو تابع add اگه 2 تا ماتريس هم سايز نباشن تابع نميتونه خروجی برگردونه و خطا برميگردونه برای رفع اين مشکل بايد چيکار کرد"
نقل قول: ولی من ميخوام با private تعريف کنم و توابعش رو اضافه کنم آيا امکانش هست؟
خب private تعریف کنید. مشکلی پیش نمیاد. همه توابعی که تو کلاس تعریف می کنید به اعضای private دسترسی دارن.
نقل قول: در مورد خروجی هم نميخام خروجی نده فقط ميخوام اين مشکل رو که گفتم بر طرف کنم:
"تو تابع add اگه 2 تا ماتريس هم سايز نباشن تابع نميتونه خروجی برگردونه و خطا برميگردونه برای رفع اين مشکل بايد چيکار کرد"
من که گفتم . . . ! با صفر جمع کنید و به عنوان خروجی بدید.
کد:
#include <iostream>
using namespace std;
class matris
{
private:
double** data;
int rowsize,colsize;
public:
matris(int row,int col)
{
data=new double*[row];
for(int i=0;i<row;i++)
*(data+i)=new double[col];
}
matris add(matris m1)
{
if((rowsize!=m1.rowsize) || (colsize!=m1.colsize))
{
cout<<"error";
matris m3(rowsize,colsize);
for (int i=0;i<rowsize;i++)
{
for (int j=0;j<rowsize;j++)
{
m3.data[i][j]=data[i][j]+0;
}
}
}
else
{
matris m3(rowsize,colsize);
for (int i=0;i<rowsize;i++)
{
for (int j=0;j<rowsize;j++)
{
m3.data[i][j]=data[i][j]+m1.data[i][j];
}
}
return m3;
}
}
};
int main()
{
matris m1(3,4);
return 0;
}
(۰۸-خرداد-۱۳۸۸, ۱۹:۵۹:۱۸)Sp!d3rm4n نوشته است: [ -> ]نقل قول: ولی من ميخوام با private تعريف کنم و توابعش رو اضافه کنم آيا امکانش هست؟
خب private تعریف کنید. مشکلی پیش نمیاد. همه توابعی که تو کلاس تعریف می کنید به اعضای private دسترسی دارن.
نقل قول: در مورد خروجی هم نميخام خروجی نده فقط ميخوام اين مشکل رو که گفتم بر طرف کنم:
"تو تابع add اگه 2 تا ماتريس هم سايز نباشن تابع نميتونه خروجی برگردونه و خطا برميگردونه برای رفع اين مشکل بايد چيکار کرد"
من که گفتم . . . ! با صفر جمع کنید و به عنوان خروجی بدید.
ممنون که وقت ميزاريد و پاسخ ميديد
در مورد private کردن متغير ها ميشه يه تابع و نحوه ی دسترسی بهش رو مثال بزنيد من متوجه بشم?
در مورد خروجی هم دقيق متوجه نشدم که چطوری با اضافه کردن صفر ديگه error نميگيره؟
این کد رو ببینید :
کد:
#include <iostream>
using namespace std;
class matris
{
private:
double** data;
int rowsize,colsize;
public:
matris(int row,int col)
{
data=new double*[row];
for(int i=0;i<row;i++)
*(data+i)=new double[col];
}
matris add(matris m1)
{
if((rowsize!=m1.rowsize) || (colsize!=m1.colsize))
{
cout<<"error";
return *this;
}
else
{
matris m3(rowsize,colsize);
for (int i=0;i<rowsize;i++)
{
for (int j=0;j<rowsize;j++)
{
m3.data[i][j]=data[i][j]+m1.data[i][j];
}
}
return m3;
}
}
void assign(int i, int j, double value)
{
data[i][j] = value;
}
};
int main()
{
matris m1(3,4);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 4; j++)
m1.assign(i, j, i+j);
return 0;
}
چون عضو داده ای data رو private تعریف کردیم پس دیگه نمیشه مستقیم از خارج کلاس (مثل تابع main) اونو مقدار دهی کرد. یعنی این کد اشتباهه :
کد:
int main()
{
matris m1(3,4);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 4; j++)
m1.data[i][j] = i+j;
return 0;
}
بجاش یه تابع public تو کلاس تعریف کردیم برای مقداردهی به data. چون تو تابع به توابع private دسترسی داریم. درواقع بجای اینکه مستقیم به data دسترسی داشته باشیم یه تابع public تعریف کردیم برای مقدار دادن . . . تابع assign
در مورد خروجی هم وقتی اندازه ماتریس ها برابر نباشه نمیتونیم جمعشون کنیم و چیزی برای خروجی نداریم. درحالی که تابع باید یه خروجی به از نوع ماتریس داشته باشه. حالا من یه ماتریس درست کردم و درایه هاش رو با صفر جمع کردم و به عنوان خروجی دادم. یعنی ماتریس تغییر نکرد. اصلا میتونستید با صفر جمع نکنید. هدف فقط این بود که تابع یه چیزی برگردونه. یه راه حل دیگش هم استفاده از return *this هست. یعنی همون شیی صدا زننده تابع برگردونده بشه. تو این حالت هم ماتریس تغییری نمیکنه.
موفق باشید
(۰۸-خرداد-۱۳۸۸, ۲۳:۲۸:۳۹)Sp!d3rm4n نوشته است: [ -> ]این کد رو ببینید :
چون عضو داده ای data رو private تعریف کردیم پس دیگه نمیشه مستقیم از خارج کلاس (مثل تابع main) اونو مقدار دهی کرد. یعنی این کد اشتباهه :
بجاش یه تابع public تو کلاس تعریف کردیم برای مقداردهی به data. چون تو تابع به توابع private دسترسی داریم. درواقع بجای اینکه مستقیم به data دسترسی داشته باشیم یه تابع public تعریف کردیم برای مقدار دادن . . . تابع assign
در مورد خروجی هم وقتی اندازه ماتریس ها برابر نباشه نمیتونیم جمعشون کنیم و چیزی برای خروجی نداریم. درحالی که تابع باید یه خروجی به از نوع ماتریس داشته باشه. حالا من یه ماتریس درست کردم و درایه هاش رو با صفر جمع کردم و به عنوان خروجی دادم. یعنی ماتریس تغییر نکرد. اصلا میتونستید با صفر جمع نکنید. هدف فقط این بود که تابع یه چیزی برگردونه. یه راه حل دیگش هم استفاده از return *this هست. یعنی همون شیی صدا زننده تابع برگردونده بشه. تو این حالت هم ماتریس تغییری نمیکنه.
موفق باشید
به عنوان سؤال آخر
اگه من بخوام اپراتور جمع و مساوی رو برای اين کلاس بارگزاری اضافه کنم به شکلی که همچين عبارتی:
matris m1(3,4),m2(3,4),m3(3,4
m3=m1+m2
معتبر باشه چيکار بايد انجام بدم؟
ممنون
سلام !
الان هیچ کامپایلری تو دست و بالم نیست ! اینو تو نت پد نوشتم امیدوارم جواب بده. اینا رو باید تو کلاس تعریف کنید.
کد:
friend martris& operator+ (matris& m1, matris& m2)
{
if (m1.rowsize == m2.rowsize && m1.colsize == m2.colsize)
{
matris m3(m1.rowsize, m1.colsize);
for (int i = 0; i < m1.rowsize; i++)
for (int j = 0; j < m1.col size; j++)
m3.data[i][j] = m1.data[i][j] + m2.data[i][j];
return m3;
}
}
friend void operator= (matris& m1, matris& m2)
{
if (m1.rowsize == m2.rowsize && m1.colsize == m2.colsize)
{
matris m3(m1.rowsize, m1.colsize);
for (int i = 0; i < m1.rowsize; i++)
for (int j = 0; j < m1.col size; j++)
m1.data[i][j] = m2.data[i][j];
}
}