C++
مشکل
وقتی که یک متغیر اشاره گر استاتیک (مثل: static char* st_ptr) در کلاستان دارید، که در طول اجرای برنامه با عملگر 'new' به آن حافظه اختصاص میدهید، بعد از آن چگونه فضای آن را آزاد میکنید؟ در تابع main ؟ اما چطور اصول برنامه نویسی شیئ گرا (مجتمع سازی و مخفی سازی داده ها) را رعایت میکنید؟
این قطعه کد یک روش برای دست یافتن به این ملزومات را ارائه میدهد.
راه حل
استفاده از مخرب ها، که درست در آخر هر چیزی اجرا میشوند.
پیاده سازی
یک struct استاتیک در کلاس تعریف میکنیم(private یا public)، سپس تمام متغیرهای استاتیک را بعنوان اعضای غیر استاتیک به ساختار اضافه میکنیم، در نتیجه تمام آن متغیرها، مانند اعضای استاتیک کلاس خواهند شد(فقط باید برای دستیابی به آنها از نام ساختار هم استفاده کنیم). میتوانیم این متغیرها را در سازنده ساختار مقدار دهی اولیه کنیم و نیازی نیست که تک تک آنها را در حوزه فایل تعریف کنیم، فقط ساختار را تعریف میکنیم و همه اعضای آن تعریف شده خواهند بود : ';class1::statics class1::st1'
سایر مزایا
قرار دادن تمام متغیرهای استاتیک در یک ساختار، آسان سازی مقداردهی اولیه به اعضای استاتیک.
نکته
سازنده ساختار با شروع برنامه اجرا خواهد شد و مخرب در پایان برنامه(حتی اگر هیچ نمونه ای از کلاس ایجاد نشده باشد، چراکه ساختار از جایی که تعریف شده(;class1::statics class1::st1) تا آخر برنامه وجود خواهد داشت).
توجه
در VC++6 ممکن است مخرب ساختار درست اجرا نشود، بنابراین در VC++2005 کامپایل نمایید.
وقتی که یک متغیر اشاره گر استاتیک (مثل: static char* st_ptr) در کلاستان دارید، که در طول اجرای برنامه با عملگر 'new' به آن حافظه اختصاص میدهید، بعد از آن چگونه فضای آن را آزاد میکنید؟ در تابع main ؟ اما چطور اصول برنامه نویسی شیئ گرا (مجتمع سازی و مخفی سازی داده ها) را رعایت میکنید؟
این قطعه کد یک روش برای دست یافتن به این ملزومات را ارائه میدهد.
راه حل
استفاده از مخرب ها، که درست در آخر هر چیزی اجرا میشوند.
پیاده سازی
یک struct استاتیک در کلاس تعریف میکنیم(private یا public)، سپس تمام متغیرهای استاتیک را بعنوان اعضای غیر استاتیک به ساختار اضافه میکنیم، در نتیجه تمام آن متغیرها، مانند اعضای استاتیک کلاس خواهند شد(فقط باید برای دستیابی به آنها از نام ساختار هم استفاده کنیم). میتوانیم این متغیرها را در سازنده ساختار مقدار دهی اولیه کنیم و نیازی نیست که تک تک آنها را در حوزه فایل تعریف کنیم، فقط ساختار را تعریف میکنیم و همه اعضای آن تعریف شده خواهند بود : ';class1::statics class1::st1'
سایر مزایا
قرار دادن تمام متغیرهای استاتیک در یک ساختار، آسان سازی مقداردهی اولیه به اعضای استاتیک.
نکته
سازنده ساختار با شروع برنامه اجرا خواهد شد و مخرب در پایان برنامه(حتی اگر هیچ نمونه ای از کلاس ایجاد نشده باشد، چراکه ساختار از جایی که تعریف شده(;class1::statics class1::st1) تا آخر برنامه وجود خواهد داشت).
توجه
در VC++6 ممکن است مخرب ساختار درست اجرا نشود، بنابراین در VC++2005 کامپایل نمایید.
کد قالبدار:
#include
using namespace std;
#include
class class1
{
public:
static struct statics
{
int st_int;
char* st_ptr;
statics()
{
st_int = 35;
st_ptr = new char[20];
strcpy( st_ptr, "struct_String");
}
~statics()
{
delete st_ptr;
}
}st1;
};
class1::statics class1::st1;
int main()
{
class1 cl1;
cl1.st1.st_int = 43;
strcpy( cl1.st1.st_ptr, "main_String"); // don't use 'cl1.st1.st_ptr = "String"', because it will get a const-pointer, then when you want to delete that and you can't!
class1 cl2;
cout << cl2.st1.st_ptr << endl << cl2.st1.st_int << endl; // prove that the constructor of struct will be called just one time
return 0;
}
+ نوشته شده در چهارشنبه ۱ آبان ۱۳۸۷ ساعت ۳:۲۱ ب.ظ توسط محمد مسی
|