Jump to content

Задачи - ООП, Седмица 11, 29.04.2026

За решаване

Задача 1

Реализирайте шаблонен клас Pair, който пази две стойности от типове T и U. Реализирайте съотвените мутатори и селектори за константни и неконстантни обекти.

Задача 2

Реализирайте шаблонен клас Option, който съхранява стойност от тип T.

Нека конструкторите да не са публични. За създаване на обект, имплементирайте статични методи Some и None, първия от които приема стойност, а втория не приема нищо.

Целта е следната: ако един Option е създаден чрез None, тогава обозначаваме че няма стойност, а чрез Some показваме че има стойност. Идеята е аналогична на това когато един указател е nullptr или не, но работи в по-общи случаи.

Имплементирайте методи:

Задача 3

Реализирайте шаблонен клас SharedPointer, който пази динамично-заделен указател към тип T. Допълнително, класа следи за бройката свои инстанции.

С други думи, при всяко копиране на създадения обект, увеличаваме бройката, и при всяко унищожаване (извикване на деструктор) намаляваме бройката. Изтриването на паметта (указателя) се случва тогава, и само тогава когато бройката стигне нула.

Това е вид "smart pointer": динамично-заделен указател който сам освобождава паметта си, без ние да пишем експлицитен delete!
В C++ има и други видове smart pointer-и, като "unique pointer" (който е описан в Задача 6). Добър въведителен ресурс по темата е този.

Реализирайте operator* и operator->, които съответстват на операциите върху запазения указател. Тоест, *x трябва да има един и същ ефект върху int* и върху SharedPointer от int*.

question Как работи operator->?

Имплементирайте също метод 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.

Освен голяма петица, реализирайте член-функции:

За самоподготовка

Задача 5

Реализирайте клас DoubleVector, който съхранява две неограничени и оразмеряеми количества от обекти, съответно от типове T и U.

Имплементирайте голяма петица и член-функциите от Задача 4, обаче всяка трябва да е налична и за двете последователности от обекти.

Задача 6

Реализирайте шаблонен клас UniquePointer, който пази указател към тип T. Класа трябва да осигури, че само един обект има този указател. С други думи, не може да има копия!

Реализирайте operator* и operator->, които съответстват на операциите върху запазения указател (т.е. *x трябва да има същия ефект, без значение дали работим с int* или SharedPointer, който съхранява int*).