یک سری از اشکالات که با یک نگاه میشه دید :
۱ـ اسم کلاس ها بهتره که با حرف بزرگ شروع بشه .
۲ـ کد شما circular dependecy داره برای رفع این مشکل این لینک رو ببینین : راه های جلوگیری از circular dependency
بهترین کاری هم که شما این جا می تونین بکنین اینه که به جای include کردن در فایل های هدر forward declaration کنید
به این شکل مثلا :
#pragma once
class line;
class polygon;
class point
{
private:
int first;
int second;
public:
point();
point (int x,int y);
int pow(int);
int getX();
int getY();
int distance(point* other);
line* Line(point*);
polygon* triangle(point*,point*);
~point();
};
3_ توی کد زیر نیازی به new کردن ندارین . constructor بعدی هم به همین شکل .
polygon::polygon(point** arr,int size)//moshkel asli man.aya dorost neveshtam?moshkel asli man
{
tip=new point*[size];
tip=arr;
size_of_point=size;
}
۴- کد زیر هم مشکل داره باید line رو new کنین بعد برگردونین . چون به این شکلی که نوشتین به محض خارج شدن از scope تابع line پاک میشه و خارج از تابع برنامه ارور میده راه بهتر برای این کار می تونه این باشه : آزاد سازی خودکار زمان برگشت از تابع
line* point::Line(point* other)//sakhtane yek line ba estefade az do point
{
line l(this,other);
return &l;//aya be in shekl bayad bashe?hadaf ine ke khoroje ye esharegar be object line bashe.
}
منظورم از new کردن به این شکله :
line* point::Line(point* other)//sakhtane yek line ba estefade az do point
{
line* l=new line(this,other);
return l;//aya be in shekl bayad bashe?hadaf ine ke khoroje ye esharegar be object line bashe.
}
در ضمن این جا اصلا نیازی به new کردن هم ندارین line رو با مقدار برگردونین .
5_ مشکل از sqrt نیست مشکل از pow هستش . ورودی pow باید ۲ تا متغیر double باشه نه یکی .
6 _ نحوه نوشتن destructor کلاس polygon هم مشکل داره :
polygon::~polygon()//tarze sahihe distructor(emla sahiih in destructor hast albate ) polygon che torie?
{
if(tip!=0)
{
delete []tip;
delete tip;
}
if(l!=0)
{
delete []l;
delete l;
}
}
برای پاک کردن آرایه ۲ بعدی باید به این شکل عمل کنین : این لینک رو هم ببینید آموزش آرایه ۱ بعدی و ۲ بعدی در c
polygon::~polygon()//tarze sahihe distructor polygon che torie?
{
if(tip != NULL)
{
for(int i=0;i<size_of_pointes;i++)
{
delete[] tip[i];
}
delete[] tip;
}
// l ham be hamin shekl
}
7_ وقتی که یک تابع رو داخل کلاس به این شکل تعریف می کنین :
public:
polygon();
polygon(point** arr,int size);//sakhtane yek polygon ba point ha.
polygon(line** arr,int size);//sakhtane yek polygon ba line ha.
bool isTriangle();//..
bool isSquare();//..
~polygon();
};
توی فایل cpp باید به این شکل تعریف بشه :
ا
bool isTriangle()//eshtebah
{
if((size_of_point==3) || (size_of_line==3))//chera zire size_of_point va size_of_line khate ghermez mikeshe?chera error mide?
return true;
else
return false;
}
//dorost
bool polygon::isTriangle()]
{
if((size_of_point==3) || (size_of_line==3))//chera zire size_of_point va size_of_line khate ghermez mikeshe?chera error mide?
return true;
else
return false;
}
ویرایش
شما داخل شماره 3 گفتید که نباید new کرد.
خب اگه new نکنیم پس چجوری به نقطه ها حافظه تخصیص بدیم.یعنی کد باید اینطوری بشه؟
polygon::polygon(point** arr,int size)
{
tip=arr;
size_of_point=size;
}
بله به همین شکلی که نوشتید باید باشه arr رو باید قبل از صدا زدن تابع بهش حافظه بدین به این شکل :
arr=new point*[size];
for(int i=0;i<size;i++)
{
arr=new point[size];
}
البته میتونین داخل تابع هم این کار رو بکنید ولی به نظر نمی رسه روش درستی باشه ...
راه بهتر برای این کار استفاده از vector یا list دو بعدی به جای ** هستش
تابع pow رو هم خودم تعریف کردم که یه int می گیره و توان 2 آن رو برمی گردونه.
تابع pow تون رو بزارید ببینم ؟ sqrt رو هم جدا تعریف کردین ؟ (البته pow داخل cmath هست نیازی به نوشتنش نیست )
به نظر شما تابع (triangle(point* a,point* b و (triangle(line* a,line* b درسته
مشکلی ندارن البته این جور نوشتن کلاس کلا صحیح نیست معنی نمیده آدم از توی کلاس point یک تابع داشته باشه که مثلث بسازه ! بهتره کلا پاک بشه ...
به نظر شما مفهوم point ** arr در counsturctor کلاس polygon اینه که یه آرایه از چند تا point* داشته باشیم.؟
بله
یه سوال دیگه اینکه برای کلاس چند ضلعی لازمه copy coustructor هم تعریف کرد.
هر کلاسی که داخل constructor اش از new استفاده شده باید این 3 تا رو هم داشته باشه :
operator= ,copy constructor ,destructor
پس جواب میشه بله .
شماره 4 رو ادیت کدم .