Olingan sinf va asosiy sinf 8-bobdagi “Operatorni haddan tashqari yuklash”dagi COUNTPP3 misolini eslaysizmi? Bu dastur umumiy maqsadli hisoblagich o'zgaruvchisi Counteras sinfidan foydalangan . Hisobni 0 yoki ga boshlash mumkin konstruktorlar bilan belgilangan raqamga, ++ operatori bilan ortadi va bilan o'qing get_ count ( ) operatori. Faraz qilaylik, biz Qarshi sinfni xuddi shunday ishlashi uchun uzoq va qattiq mehnat qildik Biz xohlagan tarzda va biz natijalardan mamnunmiz, bir narsadan tashqari. Bizga haqiqatan ham yo'l kerak sonini kamaytiring. Ehtimol, biz bankka kirgan odamlarni hisoblayapmiz va biz ko'paytirmoqchimiz kirganlarida sanoqni, chiqib ketganlarida esa kamaytiradi, shunday qilib sanoq ifodalaydi istalgan vaqtda bankdagi odamlar soni. Qarshi sinfning manba kodiga kamaytirish tartibini kiritishimiz mumkin . Biroq, Biz buni qilishni istamasligimizning bir qancha sabablari bor. Birinchidan, Qarshi sinf juda ishlaydi yaxshi va ko'p soatlik sinov va disk raskadrovkadan o'tdi. ( Albatta bu mubolag'a bu holatda, lekin bu kattaroq va murakkabroq sinfda to'g'ri bo'lar edi.) Agar biz aldashni boshlasak Counter uchun manba kodi bilan , sinov jarayoni yana amalga oshirilishi kerak bo'ladi, va Albatta, biz biror narsani buzishimiz va bizdan oldin yaxshi ishlagan kodni tuzatish uchun soatlab sarflashimiz mumkin
uni o'zgartirdi. Ba'zi hollarda qarshi sinfni o'zgartirmaslikning yana bir sababi bo'lishi mumkin : Biz uning manba kodiga kirish imkoni bo'lmasligi mumkin, ayniqsa u sinfning bir qismi sifatida tarqatilgan bo'lsa kutubxona. (Biz bu masalani 13-bob, “Ko‘p dasturli dasturlar”da batafsil muhokama qilamiz.) Ushbu muammolarni oldini olish uchun biz Counter-ga asoslangan yangi sinf yaratish uchun merosdan foydalanishimiz mumkin modifyingCounteritself . Mana COUNTEN roʻyxati, u yangi CountDn sinfini oʻz ichiga oladi . Qarshi sinfga kamaytirish operatorini qo'shadi : Meros olish
MEROS OLISH // count.cpp
// Hisoblagich sinf bilan meros
#include std nom maydonidan foydalanish;
//////////////////////////////////////////////////////// //////////////
sinf hisoblagichi // tayanch sinf
{
himoyalangan: //Izoh: shaxsiy emas
imzosiz int soni; //hisoblash
ommaviy:
Hisoblagich( ): count(0) //no- arg konstruktor
{ }
Hisoblagich( int c): count(c) //1-arg konstruktor
{ }
unsigned int get_ count ( ) const //sonni qaytarish
{ qaytish soni; }
Hisoblagich operatori ++ () // incr count (prefiks)
{ Qaytish hisoblagichi (++ hisoblash); }
};
//////////////////////////////////////////////////////// //////////////
class CountDn : umumiy hisoblagich //hosil qilingan sinf
{
ommaviy:
Hisoblagich operatori -- () // decr count (prefiks)
{ Qaytish Counter(--count); }
};
//////////////////////////////////////////////////////// //////////////
int main( )
{
CountDn c1; // CountDn sinfining c1
cout << “\nc1=” << c1.get_ count( ); //c1ni ko'rsatish
++c1; ++c1; ++c1; //c1 ni 3 marta oshiring
cout << “\nc1=” << c1.get_ count( ); // ko'rsatish
--c1; --c1; // c1ni ikki marta kamaytiring
cout << “\nc1=” << c1.get_ count( ); // ko'rsatish
cout << endl ;
qaytish 0;
}
Qarshi sinf bilan boshlanadi , u (bir kichik istisnodan tashqari, biz buni keyinroq ko'ring) COUNTPP3 da paydo bo'lganidan beri o'zgarmadi. E'tibor bering, soddalik uchun. Biz ushbu dasturni ikkinchisini o'z ichiga olgan POSTFIX dasturida modellashtirmadik postfiks belgisini ta'minlash uchun haddan tashqari yuklangan ++operator.