کلا new کنیم چی میشه؟ چه موقع new میکنیم؟
کاری که new می کنه اینه که زمان اجرا برای ما حافظه میگیره .
مشکلی که آرایه ها دارن اینه که سایزشون رو شما قبل از اجرای کد میدین و در طول برنامه سایز ثابته ولی برای برنامه نویسی ما اکثر اوقات نیاز به ساختار هایی داریم که زمان اجرا اندازشون کم وزیاد بشه
برای نوشتن این ساختار ها از new و اشاره گر ها استفاده می کنن.
بدون استفاده از new ساختار هایی مثل linkedlist و deque , ... رو اصلا نمیشه ساخت .
خود کلاس های ++C مثل همون vector , list ,... هم برای پیاده سازیشون از new استفاده شده .
new یکسری کاربرد های دیگه هم داره مثلا زمان نوشتن برنامه های multi threading هم به new احتیاج دارین و ...
به خاطر معایبی که new کردن داره که مهمترینش همون نیاز به delete کردن بعد از استفادست بهتره تا اون جایی که میشه ازشون استفاده نکرد .(در این مورد هم توی این لینک (آموزش اشاره گر ها )توضیج دادم )
همون تابع بالا که گفتین رو راه بهتر نوشتنش استفاده از vector دو بعدیه .
polygon::polygon(vector<vector<point>>)
در اینجا در کلاس polygon قسمت polygon::polygon(point** arr,int size) چه اتفاقی می افته؟
تنها اطلاعانی که کد بالا به ما میده اینه که یکی از ورودی های تابع از نوع **point و اون یکی عدد از نوع int هستش .
لزومی هم نداره که جتما ورودی تابع یک آرایه 2 بعدی باشه . توی همین لینکی که گذاشتید هم توضیح دادم .
برای درک بهتر مثال زیر رو در نظر بگیرید هر 3 حالت صحیح هستن .
یکبار تابع با اشاره گر به آدرس int صدا زده شده
یکبار با آدرس آرایه 1 بعدی از int
یکبار با آرایه 2 بعدی از int
#include <iostream>
#include <vector>
void func(int **arr ,int size)
{
}
int main()
{
int a;
int *pointer_to_a = &a;
func(&pointer_to_a ,1); //ok
int *b = new int[10];
func(&b,10);//ok
int **c;
c=new int*[6];
for(int i=0;i<6;i++)
{
c[i]=new int[6];
}
func(c,6);//ok
}