diff options
| Commit | 25e4aad5993d0ae93880499300a50e4e66fb439d (patch) | |
|---|---|---|
| Author | 2026-04-29 08:34:26 +0300 | |
| Committer | 2026-04-29 08:34:26 +0300 | |
| Files | bcdb4c97d73b86e86a15ef760dd555482e05785b /src/teaching | |
| syndamia.com-25e4aad5993d0ae93880499300a50e4e66fb439d.tar syndamia.com-25e4aad5993d0ae93880499300a50e4e66fb439d.tar.gz syndamia.com-25e4aad5993d0ae93880499300a50e4e66fb439d.zip | ||
| Parent | 1bc3f4fa0e3d8f04323965790d34ab10a566a058 (diff) | |
feat(teaching/oop-2025/w11): Add exercises
2 files changed, 103 insertions, 0 deletions
| -rw-r--r-- | src/teaching/oop-2025/index.du | 9 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week11/index.du | 94 |
diff --git a/src/teaching/oop-2025/index.du b/src/teaching/oop-2025/index.du index 696a20d..9b3099b 100644 --- a/src/teaching/oop-2025/index.du +++ b/src/teaching/oop-2025/index.du @@ -123,3 +123,12 @@ |: |: [url ./week10 Задачи] + +|: 11 +|: 29.04.2026 +|: Шаблонни класове + +|: +|: +|: +[url ./week11 Задачи] diff --git a/src/teaching/oop-2025/week11/index.du b/src/teaching/oop-2025/week11/index.du new file mode 100644 index 0000000..d9c0c0a --- /dev/null +++ b/src/teaching/oop-2025/week11/index.du @@ -0,0 +1,94 @@ +# Задачи - ООП, Седмица 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<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`]. + +Освен голяма петица, реализирайте член-функции: +.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*`]). |