Задачи - ООП, Седмица 11, 29.04.2026
За решаване
Задача 1
Реализирайте шаблонен клас Pair, който пази две стойности от типове T и U.
Реализирайте съотвените мутатори и селектори за константни и неконстантни обекти.
Задача 2
Реализирайте шаблонен клас Option, който съхранява стойност от тип T.
Нека конструкторите да не са публични.
За създаване на обект, имплементирайте статични методи Some и None, първия от които приема стойност, а втория не приема нищо.
Целта е следната: ако един Option е създаден чрез None, тогава обозначаваме че няма стойност, а чрез Some показваме че има стойност.
Идеята е аналогична на това когато един указател е nullptr или не, но работи в по-общи случаи.
Имплементирайте методи:
-
IsSome, връща дали има стойност -
IsNone, връща дали няма стойност -
Unwrap, връща запазената стойност
Задача 3
Реализирайте шаблонен клас SharedPointer, който пази динамично-заделен указател към тип T.
Допълнително, класа следи за бройката свои инстанции.
С други думи, при всяко копиране на създадения обект, увеличаваме бройката, и при всяко унищожаване (извикване на деструктор) намаляваме бройката. Изтриването на паметта (указателя) се случва тогава, и само тогава когато бройката стигне нула.
delete!В C++ има и други видове smart pointer-и, като "unique pointer" (който е описан в Задача 6). Добър въведителен ресурс по темата е този.
Реализирайте operator* и operator->, които съответстват на операциите върху запазения указател.
Тоест, *x трябва да има един и същ ефект върху int* и върху SharedPointer от int*.
Имплементирайте също метод RefCount, който връща броя копия.
Примерна употреба:
void inc(SharedPointer<int> val) { // val е копие на y, бройката е 3
*val++;
} // val се унищожава, бройката става 2
int main() {
SharedPointer<int> x(new int); // Първа инстанция, бройката е 1
SharedPointer<int> 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.
Освен голяма петица, реализирайте член-функции:
-
Count, която връща броя елементи -
PushBack, която добавя елемент в края на последователността. Ако е нужно, уголемява заделеното количество памет. -
operator[], който връща референция към обекта на подаден индекс. Да бъде наличен при константни и не-константни обекти. -
operator+който създава новVectorс елементите от първия и след това елементите от вторияVector -
operator+=, които добавя елементите на деснияVectorв края на левия
За самоподготовка
Задача 5
Реализирайте клас DoubleVector, който съхранява две неограничени и оразмеряеми количества от обекти, съответно от типове T и U.
Имплементирайте голяма петица и член-функциите от Задача 4, обаче всяка трябва да е налична и за двете последователности от обекти.
Задача 6
Реализирайте шаблонен клас UniquePointer, който пази указател към тип T.
Класа трябва да осигури, че само един обект има този указател.
С други думи, не може да има копия!
Реализирайте operator* и operator->, които съответстват на операциите върху запазения указател (т.е. *x трябва да има същия ефект, без значение дали работим с int* или SharedPointer, който съхранява int*).
Как работи