C++ da umumiy turlardan foydalangan holda, shablon funksiyalar va sinflarni aniqlashimiz mumkin


Sinf shablonlari (class template)



Download 52,16 Kb.
bet10/10
Sana01.07.2021
Hajmi52,16 Kb.
#106308
1   2   3   4   5   6   7   8   9   10
Bog'liq
C

Sinf shablonlari (class template)

Sinf shablonini ishlatish



sinf_nomi obyekt;

 

Sinf shabloni uchun oddiy misol.



  1. #include

  2. using namespace std;

  3. template

  4. class mypair {

  5. T a, b;

  6. public:

  7. mypair (T first, T second)

  8. {a=first; b=second;}

  9. T getmax ();

10. };

11. template

12. T mypair::getmax ()

13. {


14. T retval;

15. retval = a>b? a : b;

16. return retval;

17. }


18. int main () {

19. mypair myobject (100, 75);

20. cout << myobject.getmax();

21. return 0;

22. }

 

Sinf shablonida ikki xil toifadan foydalanish



  1. #include

  2. using namespace std;

  3. template class myclass

  4. {

  5. Type1 i;

  6. Type2 j;

  7. public:

  8. myclass(Type1 a, Type2 b) { i = a; j = b; }

  9. void show() { cout << i << ' ' << j << '\n'; }

10. };

11. int main()

12. {

13. myclass ob1(10, 0.23);



14. myclass ob2('X', "Templates add power.");

15. ob1.show(); // show int, double

16. ob2.show(); // show char, char *

17. return 0;

18. }

Dastur natijasi:



10 0.23

X Templates add power.

 

Maxsuslashtirilgan sinf shabloni



template<> konstruktori maxsusashtirilgan sinf shabloni uchun ishlatiladi.

  1. template class myclass {

  2. T x;

  3. public:

  4. myclass(T a) {

  5. cout << "Inside generic myclass\n";

  6. x = a;

  7. }

  8. T getx() { return x; }

  9. };

10. // int toifasi uchun maxsuslashtirilgan sinf shabloni.

11. template <> class myclass {

12. int x;

13. public:

14. myclass(int a) {

15. cout << "Inside myclass specialization\n";

16. x = a * a;

17. }


18. int getx() { return x; }

19. };


Shablonning asosiy xususiyatlari:

• reusable kod yozish imkonini beradi.

• Shablonlar yordamida framework lar yaratish mumkin

X Templates add power.

• Dastur kodi egiluvchanlik xususiyatiga ega bo'ladi.

• Turli xil tipdagi ma'lumotlar ustida ishlash uchun kod yozishda vaqtni tejash.

• C++ dagi STL lar (Standard Shablon Kutubxonalar), nomidan ko'rinib turibdiki, shablonlar yordamida yaratilgan

 


  1. 1.    Sinf shablonlari (class template)

Sinf uchun umumiy turni aniqlash mumkin.

Oldingi qismda funksiya uchun mo`ljallangan tur parametrga ega funksiya shabloni aniqlandi. Biz sinf uchun mo`ljallangan tur parametrga ega sinfni ham aniqlashimiz mumkin. Tur parametrlar sinfning tur shakllantiriladigan ixtiyoriy qismida foydalanilishi mumkin.



int qiymatlar uchun stek hosil qilish mumkin. Quyida, 1.1a-rasmdagi kabi, o`sha sinf nusxasi va uning UML sinf diagrammasi berilgan.

StackOfIntegers




-elements[100]: int

-size: int






+StackOfIntegers()

+empty(): bool const

+peek(): int const

+push(value: int): void

+pop(): int

+getSize(): int const






(a)




StackOfIntegers




-elements[100]: T

-size: int






+Stack()

+empty(): bool const

+peek(): T const

+push(value: T): void

+pop(): T

+getSize(): int const






(b)


1.1-rasm. StackStack sinfining umumiy versiyasi

  1. #ifndef STACK_H

  2. #define STACK_H

 

  1. class StackOfIntegers

  2. {

  3. public:

  4. StackOfIntegers();

  5. bool empty() const;

  6. int peek() const;

  7. void push(int value);

10. int pop();

11. int getSize() const;

 

12. private:



13. int elements[100];

14. int size;

15. };

 

16. StackOfIntegers::StackOfIntegers()



17. {

18. size = 0;

19. }

 

20. bool StackOfIntegers::empty() const



21. {

22. return size == 0;

23. }

 

24. int StackOfIntegers::peek() const



25. {

26. return elements[size - 1];

27. }

 

28. void StackOfIntegers::push(int value)



29. {

30. elements[size++] = value;

31. }

 

32. int StackOfIntegers::pop()



33. {

34. return elements[--size];

35. }

 

36. int StackOfIntegers::getSize() const



37. {

38. return size;

39. }

 

40. #endif



Boyalgan int kalit so`zlarini double, char, yoki string bilan almashtirib, double, char va string qiymatlar uchun StackOfDouble, StackOfChar va StackOfString kabi sinflarni aniqlash uchun ushbu sinfni osongina o`zgartirishlar kiritishimiz mumkin. Lekin, deyarli bir xil bo`lgan bir nechta sinflarni aniqlamasdan, shunchaki ixtiyoriy turdagi elemen uchun ishlaydigan bitta shablon sinfni aniqlashimiz mumkin. Yangi umumiy Stack sinfi uchun UML diagramma 1.1b-rasmda berilgan. 1.4-kodli ro`yxatda umumiy tur elementlarini saqlashga mo`ljallangan umumiy stek sinfi aniqlangan.

1.4-kodli ro`yxat. GenericStack.h

  1. #ifndef STACK_H

  2. #define STACK_H

 

  1. template <typename T>

  2. class Stack

  3. {

  4. public:

  5. Stack();

  6. bool empty() const;

  7. T peek() const;

10. void push(T value);

11. T pop();

12. int getSize() const;

 

13. private:



14. T elements[100];

15. int size;

16. };

 

17. template <typename T>



18. Stack::Stack()

19. {


20. size = 0;

21. }


 

22. template <typename T>

23. bool Stack::empty() const

24. {


25. return size == 0;

26. }


 

27. template <typename T>

28. T Stack::peek() const

29. {


30. return elements[size - 1];

31. }


 

32. template <typename T>

33. void Stack::push(T value)

34. {


35. elements[size++] = value;

36. }


 

37. template <typename T>

38. T Stack::pop()

39. {


40. return elements[--size];

41. }


 

42. template <typename T>

43. int Stack::getSize() const

44. {


45. return size;

46. }


 

47. #endif

Sinf shablonlari sintaksisi asosan funksiya shablonlari bilan bir xil. Xuddi funksiya shablonidagi kabi sinf aniqlanishidan oldin template qo`shimchasi yozilishi kerak (47-qator).

template T>

Xuddi oddiy ma’lumot turiga o`xshab, sinfda tur parametri qo`llanilishi mumkin. Bu yerda T tur peek()(10-qator), push(T value) (11-qator), va pop() (12-qator) funksiyani aniqlash uchun ishlatilgan. Shuningdek, T tur 16-qatorda, massiv elementlarini e’lon qilishda ham qo`llanilgan.

Konstruktorlar va funksiyalar ularning o`zlari shablonlar ekanliklari inobatga olinmaganda, oddiy sinflardagi kabi, bir xil yo`l bilan aniqlanadi. Buni amalga oshirish uchun, template qo`shimchasini konstruktor yoki funksiyaning bosh qismidan avval joylashtirish kerak bo`ladi. Masalan:

template <typename T>

Stack::Stack()

{

size = 0;



}

template <typename T>

bool Stack::empty()

{

return size == 0;

}

template <typename T>

T Stack::peek()

{

return elements[size - 1];

}

Shu o`rinda e’tibor qaratishimiz lozimki, :: qarashlilik operatoridan oldin keladigan sinf nomi Stack, Stack emas.



Maslahat. GenericStack.h sinf aniqlanishini va tadbiqini bitta faylga o`tkazadi. Sinf aniqlanishini va tadbiqini ikkita turli fayllarga joylashtirish yaxshi ish albatta. Biroq, shunday bo`lsa ham, sinf shablonlari uchun ularni birlashtirish bir muncha xavfsizroq, chunki, ba’zi kompilyatorlar ularni tarqoq holda kompilyatsiya qilmaydi.

1.5-kodli ro`yxatda, uning qatorida int qiymatlar uchun va 18-qatorda satrlar uchun stek hosil qiluvchi sinovchi dastur berilgan.



1.5-kodli ro`yxat. TestGenericStack.cpp

  1. #include

  2. #include

  3. #include "GenericStack.h"

  4. using namespace std;

 

  1. int main()

  2. {

  3. // int qiymatlar uchun yangi stek yaratish

  4. Stack<int> intStack;

  5. for (int i = 0; i < 10; i++)

10. intStack.push(i);

 

11. while (!intStack.empty())



12. cout << intStack.pop() << " ";

13. cout << endl;

 

14. // Satrlar uchun yangi stek yaratish



15. Stack stringStack;

16. stringStack.push("Chicago");

17. stringStack.push("Denver");

18. stringStack.push("London");

 

19. while(!stringStack.empty())



20. cout << stringStack.pop() << " ";

21. cout << endl;

 

22. return 0;



23. }

Natija:

9 8 7 6 5 4 3 2 1 0

London Denver Chicago



 

Shablon sinfda ob’yekt yaratishda T - tur parametri uchun aniq bir turni belgilab olishimiz zarur. Masalan:

Stack intStack;

Bu e’lon qilinish T - tur parametrini int bilan almashtiradi. Shu sababli ham intStack steki int qiymatlar steki hisoblanadi. intStack ob’yekti ham xuddi ixtiyoriy boshqa ob’yektlarga o`xshaydi. Dastur intStack stekka int qiymatlarni qo`shish uchun push funksiyasini chaqiradi (11-qator) va stekdan elementlarni chop etadi (13-14-qatorlar).

Dastur 18-qatorda satrlarni yozish uchun stek ob’yektni e’lon qiladi, stekda uchta satrni yozadi (19-21-qatorlar) va stekdagi satrlarni chop etadi (24-qator).

Quyidagi kodli qismlarga e’tibor beraylik:



9-11-qatorlar.

while (!intStack.empty())

  cout << intStack.pop() << " ";

cout << endl;

23-25-qatorlar

while (!stringStack.empty())

  cout << stringStack.pop() << " ";

cout << endl;

Bu kodli qismlar deyarli bir xil. Ular o`rtasidagi farq intStack va stringStack yozuvlaridagi shakllantirish operatsiyalarida. Stekdagi elementlarni chop etish uchun stek parametrli funksiya aniqlashimiz mumkin. Yangi dastur 1.6-kodli ro`yxatda keltirilgan.



1.6-kodli ro`yxat. TestGenericStackWithTemplateFunction.cpp

  1. #include

  2. #include

  3. #include "GenericStack.h"

  4. using namespace std;

  5.  

  6. template <typename T>

  7. void printStack(Stack& stack)

  8. {

  9. while(!stack.empty())

10. cout << stack.pop() << " ";

11. cout << endl;

12. }


  1. 13.  

14. int main()

15. {


16. // int qiymatlar uchun yangi stek yaratish

17. Stack<int> intStack;

18. for (int i = 0; i < 10; i++)

19. intStack.push(i);

20. printStack(intStack);


  1. 21.  

22. // Satrlar uchun yangi stek yaratish

23. Stack<string> stringStack;

24. stringStack.push("Chicago");

25. stringStack.push("Denver");

26. stringStack.push("London");

27. printStack(stringStack);



  1. 28.  

29. return 0;

30. }


Shablon funksiyada umumiy sinf nomi Stack tur parametr sifatida qo`llanilgan (7-qator).

Eslatma. C++ sinf shablonida tur parametr uchun jimlik qoidasiga ko`ra tur ni ta’minlashga ruxsat beradi. Masalan, jimlik qoidasiga ko`ra tur sifatida, umumiy Stack sinfida quyidagicha ta’minlash mumkin:

template<typename T = int>

class Stack

{

...



};

Endi sinf shablonida jimlik qoidasi turidan foydalanishimiz mumkin, lekin funksiya shablonida emas.



Eslatma.Biz shuningdek, template qo`shimchasi tarkibida tur parametri bilan tursiz parametr ni ham qo`llashimiz mumkin. Masalan, Stack sinfda parametr sifatida, massiv o`lchamini quyidagicha e’lon qilish mumkin:

template<typename T, int capacity>

class Stack

{

...



private:

T elements[capacity];



int size;

};

Shunday qilib, biz stek hosil qilganimizda, massiv o`lchamini belgilashimiz mumkin. Masalan,



Stack500
> stack;

500 tagacha satrlarni saqlay oluvchi stekni e’lon qiladi.



Eslatma. Sinf shablonida statik a’zolarni aniqlash mumkin. Har bir shablon belgilanishi o`zining statik ma’lumotlar maydonidagi nusxasiga ega.

kalit

Download 52,16 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   10




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish