مطالعه موردی کلاسها: آرایه پویا
نوشته شده توسط مدیر سایت چهارشنبه 27 آبان 1388 ساعت 23:28
می خواهیم یک کلاس آرایهی پویا از نوع byte ایجاد کنیم که خودش مدیریت حافظه را به صورت داخلی انجام میدهد و توابعی برای تعیین مقادیر المانهای آرایه و گرفتن آنها دارد. همچنین دو تابع کمکی دیگر دارد که یکی مقادیر آرایه را با اعداد تصادفی پر کرده و دیگری مقادیر آرایه را چاپ میکند.
تعریف این کلاس در لیست زیر آمده است:
typedef unsigned char byte;
class SmartArray{
public:
//Default constructor
SmartArray(){
init();
};
//Another constructor
SmartArray(int length, bool initialize = false, byte initVal = 0)
{
init(length, initialize, initVal);
};
//A member function to initialize array
bool init(int length = 0, bool initialize = false, byte initVal = 0){
assert(length >= 0);
if(length <= 0){
this->length = 0;
pData = NULL;
return true;
}
this->length = length;
pData = new byte[length];
if(initialize){
for (int i = 0; i < length; i++)
pData[i] = initVal;
}
return true;
};
//The only destructor
~SmartArray()
{
if(pData){
length = 0;
delete [] pData;
pData = NULL;
}
};
//A member function to access array elements
byte get(int i){
assert(pData);
assert(length > i && i > -1);
if(!pData || length <= i || i < 0)
return 0;
return pData[i];
}
//A member function to change array elements
bool set(int i, byte b)
{
assert(pData);
assert(length > i && i > -1);
if(!pData || length <= i || i < 0)
return false;
pData[i] = b;
return true;
}
bool RandomFill()
{
srand(time(0));
for(int i = 0; i < length; i++)
pData[i] = rand() % 256;
return true;
}
void print(int idx0 = 0, int idx1 = -1)
{
idx0 = max(0, idx0);
idx1 = min(length-1, idx1);
if(idx1 < 0)
idx1 = length-1;
printf("The array contains:\n");
for (int i = idx0; i <= idx1; ++i)
{
printf("[%d]: %.3d\n", i, pData[i]);
}
}
private:
byte* pData;
int length;
};
این کلاس دو متغیر خصوصی دارد، یکی pData که اشارهگری از نوع byte است و آدرسی است که اطلاعات (المانهای آرایه) در آنجا ذخیره خواهد شد. متغیر دوم length است که طول آرایه را در خود نگه خواهد داشت. یک تابع init تعریف کردهایم که طول آرایه را از کاربر میگیرد و همچنین دو پارامتر به منظور مقداردهی اولیه المانهای آرایه دریافت میکند؛ یکی متغیرinitialize که از نوع bool است و مشخص میکند که آرایه باید مقداردهی اولیه بشود یا خیر و دومی متغیر initVal است که تنها در صورتی موثر است که متغیر قبلی true باشد. این متغیر ورودی، تعیین کننده مقداری است که باید در تمام المانهای آرایه به عنوان مقدار اولیه قرار گیرد. در این تابع تخصیص حافظه به کمک عملگر new انجام شده و طول آرایه در متغیر length ذخیره میشود. تابع assert که در اینجا دیده میشود تنها در هنگام کامپایل برنامه به صورت دیباگ عمل میکند و کار آن هشدار دادن به برنامه نویس است؛ به این ترتیب که اگر پارامتر آن صحیح نباشد پیغام هشداری به برنامه نویس خواهد داد. از این قابلیت در حین توسعه برنامه و در مد Debug استفاده میشود و در نسخهی نهایی که به صورت Release کامپایل خواهد شد این دستور تاثیری ندارد.
تابع get به منظور دسترسی به المانهای آرایه تعبیه شده است، چرا که متغیر pData خصوصی تعریف شده و دسترسی به آن از بیرون کلاس ممکن نیست. لذا وجود چنین تابعی لازم است. در مقابل تابع set برای تغییر مقادیر عناصر آرایه ایجاد شده است.
تابع RandomFill آرایه را با مقادیر تصادفی بین 0 و 255 پر میکند و تابع print محتویات آرایه را روی کنسول نمایش میدهد. این کلاس یک تابع مخرب هم دارد که مسئولیت آن آزادسازی حافظهی اشغال شده توسط pData است.
این برنامه قبلا در قالب مثال نهم Exam_09 در سایت قرار داده شده است. آن را دانلود کرده و نحوه استفاده آن را ببینید.

