الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

new operator: overloading

بدأه aromran في 3 مايو 2011 · 2 رد · 376 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع


using namespace std;

void outOfMem()

{

cerr << "Unable to satisfy request for memory\n";

abort();

}

class LargeObj
{
public:

LargeObj(){ cout<<"I am the large object constructor!"<<endl;}
};



class Widget {

public:

Widget(){ cout<<"I am the Widget constructor!"<<endl;}

static new_handler set_new_handler(new_handler p) throw();

static void * operator new(size_t size) throw(bad_alloc);

private:

static new_handler currentHandler;

};

new_handler Widget::currentHandler = 0;
// init to null in the class impl. file




new_handler Widget::set_new_handler(new_handler p) throw()

{

new_handler oldHandler = currentHandler;

currentHandler = p;

cout<<"I am set_new_handler func!"<<endl;

return oldHandler;

}

class NewHandlerHolder {

public:

explicit NewHandlerHolder(new_handler nh) // acquire current

:handler(nh) {} // new-handler



~NewHandlerHolder() // release it
{
cout<<endl<<" ~NewHandlerHolder()"<<endl;
set_new_handler(handler);
}

private:

new_handler handler; // remember it


NewHandlerHolder(const NewHandlerHolder&); // prevent copying

NewHandlerHolder& operator=(const NewHandlerHolder&); // (see Item 14)

};


void * Widget::operator new(size_t size) throw(bad_alloc)

{

NewHandlerHolder h(set_new_handler(currentHandler)); // install Widget's new-handler


return ::operator new(size); // allocate memory or throw restore global new-handler

}


int main()

{

cout<<endl<<"void outOfMem(); "<<endl;
void outOfMem(); // decl. of func. to call if mem. alloc.

// for Widget objects fails


cout<<endl<<"Widget::set_new_handler(outOfMem); "<<endl;
Widget::set_new_handler(outOfMem); // set outOfMem as Widget's

// new-handling function


cout<<endl<<"Widget *pw1 = new Widget; "<<endl;
Widget *pw1 = new Widget; // if memory allocation

// fails, call outOfMem


cout<<endl<<"string *ps = new string;"<<endl;
string *ps = new string; // if memory allocation fails,

// call the global new-handling

// function (if there is one)


cout<<endl<<"Widget::set_new_handler(0); "<<endl;
Widget::set_new_handler(0); // set the Widget-specific

// new-handling function to

// nothing (i.e., null)


cout<<endl<<"Widget *pw2 = new Widget; "<<endl;
Widget *pw2 = new Widget; // if mem. alloc. fails, throw an

// exception immediately. (There is

// no new- handling function for

// class Widget.)



cout<<"press enter to exit!"<<endl;
cin.get();
return 0;
}



#include<iostream>

1
#2

تشرح الكثير من الدروس والبرامج كافة عمليات التحميل الزائد لعمليات c++ ولكن نادرا ما تتطرق لتحميل العملية new في البرنامج السابق المقتبس فكرا من احد الكتب قمت بتجميع الأفكار ووضعها في برنامج كي يتسنى للأخوة الاعضاء الاستفادة منه عمليا..

طبعا يعتمد هذا البرنامج على فكرة اساسيه وهي النمط new_handler المعرف في كـ tyedef في المكتبة المعيارية وهو مؤشر على تابع يأخذ void ويعيد void ..

سأقوم بالشرح ان شاءا لله استنادا لاستفسارات الاعضاء..

1 −1
#3

مشكور اخى على المبادرة الطيبة

الى الامام دائما

وبالتوفيق ان شاء الله


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

مواضيع مشابهة