Summary Files Commits Branches @commit @diff @stats
path: root / src
diff options
context:
space:
mode:
Commit25e4aad5993d0ae93880499300a50e4e66fb439d (patch)
Author
 Syndamia <kamen@syndamia.com>
2026-04-29 08:34:26 +0300
Committer
 Syndamia <kamen@syndamia.com>
2026-04-29 08:34:26 +0300
Filesbcdb4c97d73b86e86a15ef760dd555482e05785b /src
syndamia.com-25e4aad5993d0ae93880499300a50e4e66fb439d.tar
syndamia.com-25e4aad5993d0ae93880499300a50e4e66fb439d.tar.gz
syndamia.com-25e4aad5993d0ae93880499300a50e4e66fb439d.zip
Parent1bc3f4fa0e3d8f04323965790d34ab10a566a058 (diff)
feat(teaching/oop-2025/w11): Add exercises
2 files changed, 103 insertions, 0 deletions
-rw-r--r--src/teaching/oop-2025/index.du9
-rw-r--r--src/teaching/oop-2025/week11/index.du94
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*`]).