# Задачи - ООП, Седмица 11, 29.04.2026 'define expected-reading 4 min 'define created 28 April 2026 'define edited 29 April 2026 [$pagenav] ## За решаване ### Задача 1 Реализирайте шаблонен клас [`Pair`], който пази две стойности от типове [`T`] и [`U`]. Реализирайте съотвените мутатори и селектори за константни и неконстантни обекти. ### Задача 2 Реализирайте шаблонен клас [`Option`], който съхранява стойност от тип [`T`]. Нека конструкторите да [=не=] са публични. За създаване на обект, имплементирайте статични методи [`Some`] и [`None`], първия от които приема стойност, а втория не приема нищо. Целта е следната: ако един [`Option`] е създаден чрез [`None`], тогава обозначаваме че няма стойност, а чрез [`Some`] показваме че има стойност. Идеята е аналогична на това когато един указател е [`nullptr`] или не, но работи в по-общи случаи. Имплементирайте методи: .bulleted - [`IsSome`], връща дали има стойност - [`IsNone`], връща дали няма стойност - [`Unwrap`], връща запазената стойност ### Задача 3 Реализирайте шаблонен клас [`SharedPointer`], който пази динамично-заделен указател към тип [`T`]. Допълнително, класа следи за бройката свои [*инстанции*]. С други думи, при всяко копиране на създадения обект, увеличаваме бройката, и при всяко унищожаване (извикване на деструктор) намаляваме бройката. Изтриването на паметта (указателя) се случва тогава, и само тогава когато бройката стигне нула. .note Това е вид [url https://en.wikipedia.org/wiki/Smart_pointer "smart pointer"]: динамично-заделен указател който сам освобождава паметта си, без ние да пишем експлицитен [`delete`]!\n В C++ има и други видове smart pointer-и, като "unique pointer" (който е описан в [url #-6 Задача 6]). Добър въведителен ресурс по темата е [url https://courses.cs.washington.edu/courses/cse333/24au/lectures/16-c++-smartptr.pdf този]. Реализирайте [`operator*`] и [`operator->`], които съответстват на операциите върху запазения указател. Тоест, [`*x`] трябва да има един и същ ефект върху [`int*`] и върху [`SharedPointer`] от [`int*`]. .question Как работи [`operator->`]? Имплементирайте също метод [`RefCount`], който връща броя копия. Примерна употреба: ```c++ void inc(SharedPointer val) { // val е копие на y, бройката е 3 *val++; } // val се унищожава, бройката става 2 int main() { SharedPointer x(new int); // Първа инстанция, бройката е 1 SharedPointer y = x; // Копие, бройката е 2 *x = 5; std::cout << *x << ' ' << *y << std::endl; // Показва "5 5" inc(y); std::cout << *x << ' ' << *y << std::endl; // Показва "6 6" } // x и y се унищожават, бройката става 0 и паметта се освобождава ### Задача 4 Реализирайте шаблонен клас [`Vector`], който съхранява неограничено и оразмеряемо количество от обекти [`T`]. Освен голяма петица, реализирайте член-функции: .bulleted - [`Count`], която връща броя елементи - [`PushBack`], която добавя елемент в края на последователността. Ако е нужно, уголемява заделеното количество памет. - [`operator[]`], който връща референция към обекта на подаден индекс. Да бъде наличен при константни и не-константни обекти. - [`operator+`] който създава нов [`Vector`] с елементите от първия и след това елементите от втория [`Vector`] - [`operator+=`], които добавя елементите на десния [`Vector`] в края на левия ## За самоподготовка ### Задача 5 Реализирайте клас [`DoubleVector`], който съхранява две неограничени и оразмеряеми количества от обекти, съответно от типове [`T`] и [`U`]. Имплементирайте голяма петица и член-функциите от [url #-4 Задача 4], обаче всяка трябва да е налична и за двете последователности от обекти. ### Задача 6 Реализирайте шаблонен клас [`UniquePointer`], който пази указател към тип [`T`]. Класа трябва да осигури, че само един обект има този указател. С други думи, [=не може да има копия=]! Реализирайте [`operator*`] и [`operator->`], които съответстват на операциите върху запазения указател (т.е. [`*x`] трябва да има същия ефект, без значение дали работим с [`int*`] или [`SharedPointer`], който съхранява [`int*`]).