diff --git a/.github/workflows/module1.yml b/.github/workflows/module1.yml
index 675dc7f04..d9e96931b 100644
--- a/.github/workflows/module1.yml
+++ b/.github/workflows/module1.yml
@@ -12,7 +12,7 @@ jobs:
working-directory: shm
run: |
chmod +x check.sh
- sudo apt install -y pcregrep
- ./check.sh CMakeLists.txt
+ # sudo apt install -y pcregrep
+ # ./check.sh CMakeLists.txt
# In case of conflict do not remove above jobs. Just add your jobs below and remove this comment :)
diff --git a/module1/09-operators.md b/module1/09-operators.md
index 395ce6e97..527f92fe2 100644
--- a/module1/09-operators.md
+++ b/module1/09-operators.md
@@ -37,7 +37,7 @@ public:
```cpp
int main() {
- Person adam("Adam", 25)
+ Person adam("Adam", 25);
++adam;
std::cout << adam.getAge() << '\n'; // prints 26
}
@@ -58,7 +58,7 @@ T& T::operator +=(const T2& b);
```cpp
Computer& Computer::operator+=(Memory amount) {
- ramAmount_ += number;
+ ramAmount_ += amount;
std::cout << "Ram memory extended\n";
return *this;
}
diff --git a/module1/13-project.md b/module1/13-project.md
index 6fac23232..b573407c7 100644
--- a/module1/13-project.md
+++ b/module1/13-project.md
@@ -50,8 +50,8 @@ ___
* Każde dostarczone zadanie to 5 punktów
* 15 punktów za dostarczenie wszystkich 8 zadań do 28.06.2021 (poniedziałek) do 23:59
-* brak punktów bonusowych za dostarczenie tylko części zadań przed 28.06.
-* 8 punktów za pracę w grupie dla każdej osoby z grupy.
+* brak punktów bonusowych za dostarczenie tylko części zadań przed 28.06
+* 8 punktów za pracę w grupie dla każdej osoby z grupy
___
diff --git a/module1/index.html b/module1/index.html
index 2f89e7ddc..66cc43c2e 100644
--- a/module1/index.html
+++ b/module1/index.html
@@ -26,7 +26,7 @@
diff --git a/module2/presentation_inheritance.md b/module2/01-inheritance.md
similarity index 98%
rename from module2/presentation_inheritance.md
rename to module2/01-inheritance.md
index 0baa7910d..75047c6a2 100644
--- a/module2/presentation_inheritance.md
+++ b/module2/01-inheritance.md
@@ -5,7 +5,7 @@
## Dziedziczenie
-
+
___
@@ -275,6 +275,8 @@ protected:
class Laptop : public Computer,
public Screen {
Keyboard keyboard_;
+public:
+ void getUserInput();
};
class Tablet : public Computer,
diff --git a/module2/presentation_virtual.md b/module2/02-virtual.md
similarity index 68%
rename from module2/presentation_virtual.md
rename to module2/02-virtual.md
index 44a01f5d6..e98971d0f 100644
--- a/module2/presentation_virtual.md
+++ b/module2/02-virtual.md
@@ -2,10 +2,10 @@
# Programowanie obiektowe
-## Metody wirtualne, interfejsy, klasy abstrakcyjne
+## Metody czysto wirtualne, interfejsy, klasy abstrakcyjne
-
+
___
@@ -16,9 +16,9 @@ ___
```cpp
class Bird {
public:
- size_t getWeight();
- size_t getHeight();
- size_t getName();
+ size_t getWeight() const { return weight_; }
+ size_t getHeight() const { return height_; }
+ std::string getName() const { return name_; }
// Pure virtual function without implementation
virtual void eat() = 0;
@@ -32,7 +32,7 @@ protected:
```
-Metody `eat()` oraz `sleep()` to tzw. metody czysto wirtualne. Świadczy o tym `= 0;`. Oznacza to, że nigdzie nie znajdziemy ich implementacji dla klasy `Bird`. Klasy które dziedziczą po `Bird` będą ją musiały zaimplementować same.
+Metody `eat()` oraz `sleep()` to tzw. metody czysto wirtualne (ang. pure virtual functions). Świadczy o tym `= 0;`. Oznacza to, że nigdzie nie znajdziemy ich implementacji dla klasy `Bird`. Klasy które dziedziczą po `Bird` będą ją musiały zaimplementować same.
Znaczenie słowa `virtual` na razie przemilczymy. Jedyne co trzeba na teraz wiedzieć, to aby metoda była czysto wirtualna `= 0;` to musi być przed nią słowo `virtual`.
@@ -71,7 +71,9 @@ ___
## Użycie interfejsów
```cpp
-class Penguin : public Bird, public Swimmable {
+class Penguin : public Bird,
+ public Swimmable,
+ public Soundable {
public:
// Override from Bird
void eat() override;
@@ -79,19 +81,18 @@ public:
// Override from Swimmable
void swim() override;
+
+ // Override from Soundable
+ void makeSound() override;
};
class Hummingbird : public Bird,
- public Flyable,
- public Soundable {
+ public Flyable {
public:
// Override from Bird
void eat() override;
void sleep() override;
- // Override from Soundable
- void makeSound() override;
-
// Override from Flyable
void fly() override;
};
@@ -164,50 +165,5 @@ ___
## Słowo `virtual` i `override`
-Co to za słowa? Co one robią? O tym za chwilę ;)
+Co to za słowa? Co one robią? O tym w jednym z następnych wideo ;)
-
-___
-
-## Q&A
-
-___
-
-## Zadanie 1
-
-Przekształć klasę `Cargo` w interfejs z 4 czysto wirtualnymi metodami.
-
-```cpp
-virtual size_t getPrice() const = 0;
-virtual std::string getName() const = 0;
-virtual size_t getAmount() const = 0;
-virtual size_t getBasePrice() const = 0;
-```
-
-___
-
-## Zadanie 1 cd.
-
-Utwórz 3 pochodne klasy `Cargo`:
-
-* `Fruit`
-* `Alcohol`
-* `Item`
-
-Klasa `Fruit` powinna mieć dodatkową zmienną określającą czas do zepsucia oraz `operator--` który będzie odejmował ten czas o 1.
-Metoda `getPrice()` powinna redukować cenę odpowiednio wraz z czasem psucia naszego owocu.
-
-Klasa `Alcohol` powinna mieć dodatkową zmienną określającą procentowy udział spirytusu.
-Metoda `getPrice()` powinna być proporcjonalnie wyższa w zależności od mocy alkoholu.
-Należy ustalić bazową cenę za spirytus 96%.
-
-Klasa `Item` powinna mieć dodatkową zmienną enum określającą rzadkość przedmiotu (common, rare, epic, legendary).
-Metoda `getPrice()` powinna być adekwatnie wyliczana od poziomu rzadkości przedmiotu.
-
-___
-
-## Zadanie 2
-
-Wykorzystując wspólną klasę bazową `Cargo` spróbuj przechowywać wszystkie towary w jednym wektorze w klasie `Ship`.
-
-Dodaj funkcję `void load(std::shared_ptr cargo)`, która dodaje towar i (dla chętnych) `void unload(Cargo* cargo)`, która usuwa towar z obiektu klasy `Ship`.
diff --git a/module2/03-tasks.md b/module2/03-tasks.md
new file mode 100644
index 000000000..5ace32ea4
--- /dev/null
+++ b/module2/03-tasks.md
@@ -0,0 +1,50 @@
+
+
+# Programowanie obiektowe
+
+## Zadania
+
+
+
+
+
+___
+
+## Zadanie 5
+
+Przekształć klasę `Cargo` w interfejs z 4 czysto wirtualnymi metodami.
+
+```cpp
+virtual size_t getPrice() const = 0;
+virtual std::string getName() const = 0;
+virtual size_t getAmount() const = 0;
+virtual size_t getBasePrice() const = 0;
+```
+
+___
+
+## Zadanie 5 cd.
+
+Utwórz 3 pochodne klasy `Cargo`:
+
+* `Fruit`
+* `Alcohol`
+* `Item`
+
+Klasa `Fruit` powinna mieć dodatkową zmienną określającą czas do zepsucia oraz `operator--` który będzie odejmował ten czas o 1.
+Metoda `getPrice()` powinna redukować cenę odpowiednio wraz z czasem psucia naszego owocu.
+
+Klasa `Alcohol` powinna mieć dodatkową zmienną określającą procentowy udział spirytusu.
+Metoda `getPrice()` powinna być proporcjonalnie wyższa w zależności od mocy alkoholu.
+Należy ustalić bazową cenę za spirytus 96%.
+
+Klasa `Item` powinna mieć dodatkową zmienną enum określającą rzadkość przedmiotu (common, rare, epic, legendary).
+Metoda `getPrice()` powinna być adekwatnie wyliczana od poziomu rzadkości przedmiotu.
+
+___
+
+## Zadanie 6
+
+Wykorzystując wspólną klasę bazową `Cargo` spróbuj przechowywać wszystkie towary w jednym wektorze w klasie `Ship`.
+
+Dodaj funkcję `void load(std::shared_ptr cargo)`, która dodaje towar i (dla chętnych) `void unload(Cargo* cargo)`, która usuwa towar z obiektu klasy `Ship`.
diff --git a/module3/presentation_polymorphism.md b/module2/04-polymorphism.md
similarity index 92%
rename from module3/presentation_polymorphism.md
rename to module2/04-polymorphism.md
index 32a9b3088..8c1b6e9f5 100644
--- a/module3/presentation_polymorphism.md
+++ b/module2/04-polymorphism.md
@@ -5,7 +5,7 @@
## Polimorfizm
-
+
___
@@ -92,7 +92,7 @@ public:
class SomeClass : public Interface {
public:
- void doSth() override; // there should be an implementation in cpp file
+ void doSth() override; // there should be an implementation in the cpp file
};
int main() {
@@ -110,7 +110,7 @@ ___
`override` jest opcjonalne. Jeśli go nie podamy za sygnaturą funkcji klasy pochodnej to metoda z klasy bazowej i tak zostanie nadpisana.
-Jego użycie jest jednak dobrą praktyką, bo dzięki niemu kompilator sprawdzi czy faktycznie przeciążamy metodą z klasy bazowej i jeśli nie, to program się nie skompiluje.
+Jego użycie jest jednak dobrą praktyką, bo dzięki niemu kompilator sprawdzi, czy faktycznie nadpisujemy metodę z klasy bazowej i jeśli nie, to program się nie skompiluje.
Bez `override` mogłaby zostać utworzona nowa metoda w klasie pochodnej, która nie nadpisuje niczego z klasy bazowej.
@@ -230,7 +230,7 @@ ___
```cpp
class Doppler {
public:
- virtual sayHello() { std::cout << "I'm Doppler!"; }
+ virtual void sayHello() { std::cout << "I'm Doppler!"; }
};
class Dwarf : public Doppler {
@@ -347,21 +347,3 @@ int main() {
std::unique_ptr child2 = std::make_unique();
}
```
-
-___
-
-## Q&A
-
-___
-
-## Zadanie 3
-
-Napisz klasę `DryFruit`, która dziedziczyć będzie po klasie `Fruit`.
-
-Klasa ta powinna nadpisywać metody `getPrice()`, `getName()` oraz `operator--`.
-
-`operator--` powinien odejmować zużycie raz na 10 wywołań.
-
-Metoda `getPrice()` powinna zwracać trzykrotnie większą wartość w porównaniu do ceny bazowej.
-
-Przetestuj wywołania polimorficzne oraz podziel się wnioskami.
diff --git a/module2/05-tasks.md b/module2/05-tasks.md
new file mode 100644
index 000000000..6711b6dbf
--- /dev/null
+++ b/module2/05-tasks.md
@@ -0,0 +1,23 @@
+
+
+# Programowanie obiektowe
+
+## Zadania
+
+
+
+
+
+___
+
+## Zadanie 7
+
+Napisz klasę `DryFruit`, która dziedziczyć będzie po klasie `Fruit`.
+
+Klasa ta powinna nadpisywać metody `getPrice()`, `getName()` oraz `operator--`.
+
+`operator--` powinien odejmować zużycie raz na 10 wywołań.
+
+Metoda `getPrice()` powinna zwracać trzykrotnie większą wartość w porównaniu do ceny bazowej.
+
+Przetestuj wywołania polimorficzne oraz podziel się wnioskami w komentarzach :)
diff --git a/module2/presentation_static.md b/module2/06-static.md
similarity index 64%
rename from module2/presentation_static.md
rename to module2/06-static.md
index 803b4f6fb..65fcd3190 100644
--- a/module2/presentation_static.md
+++ b/module2/06-static.md
@@ -2,26 +2,26 @@
# Programowanie obiektowe
-## Zmienne i funkcje statyczne
+## Pola i funkcje statyczne
-
+
___
-## "Zmienna lub stała klasy"
+## Pola klasy
Czasami chcielibyśmy przypisać jakąś stałą cechę do klasy.
-Nie konkretnych obiektów, a klasy samej w sobie.
+Nie konkretnych obiektów, a klasy samej w sobie, tak, aby była ona wspólna dla wszystkich obiektów tej klasy.
Np. każdy obiekt klasy ma nazwę "Object".
```cpp
class Object {
public:
- std::string GetName() const { return name_; }
+ std::string getName() const { return name_; }
private:
const std::string name_ = "Object";
@@ -44,28 +44,33 @@ Nawet jeżeli obiekt zajmowałby dużo miejsca w pamięci, a my chcielibyśmy ty
___
-
+
## `static`
Rozwiązaniem tej uciążliwości jest `static`. Co więcej, problem ten możemy rozwiązać na 2 sposoby. Nie musimy w ten sposób tworzyć specjalnie obiektu, aby dostać się do cechy klasy, jaką jest jej nazwa.
```cpp
-class ObjectA {
+class ClassA {
public:
- static std::string getName() { return "ObjectA"; }
+ static std::string getName() { return "ClassA"; }
};
-class ObjectB {
+class ClassB {
public:
static std::string name_;
};
-std::string ObjectB::name_{"ObjectB"};
+std::string ClassB::name_{"ClassB"};
int main() {
- std::cout << ObjectA::getName() << '\n';
- std::cout << ObjectB::name_ << '\n';
+ std::cout << ClassA::getName() << '\n';
+ std::cout << ClassB::name_ << '\n';
+
+ ClassA objA;
+ std::cout << objA.getName() << '\n';
+ ClassB objB;
+ std::cout << objB.name_ << '\n';
return 0;
}
@@ -73,19 +78,3 @@ int main() {
-
-___
-
-## Q&A
-
-___
-
-## Zadanie 4
-
-Przekształć klasę bazową `Coordinates`, tak aby miała funkcję statyczną
-
-```cpp
-static size_t distance(const Coordinates& lhs, const Coordinates& rhs)
-```
-
-Funkcja ta powinna zwracać dystans pomiędzy dwoma pozycjami.
diff --git a/module2/07-tasks.md b/module2/07-tasks.md
new file mode 100644
index 000000000..e9026f135
--- /dev/null
+++ b/module2/07-tasks.md
@@ -0,0 +1,23 @@
+
+
+# Programowanie obiektowe
+
+## Zadania
+
+
+
+
+
+___
+
+## Zadanie 8
+
+Napisz/przekształć klasę `Coordinates`, która ma określać współrzędne na mapie. Powinna ona przyjmować w konstruktorze 2 parametry `positionX`, `positionY` oraz operator porównania.
+
+Ma ona posiadać funkcję statyczną `distance`:
+
+```cpp
+static size_t distance(const Coordinates& lhs, const Coordinates& rhs)
+```
+
+Funkcja ta powinna zwracać dystans pomiędzy dwoma pozycjami.
diff --git a/module2/08-recap.md b/module2/08-recap.md
new file mode 100644
index 000000000..aaf40da9c
--- /dev/null
+++ b/module2/08-recap.md
@@ -0,0 +1,25 @@
+
+
+# Programowanie obiektowe
+
+## Podsumowanie
+
+
+
+
+
+___
+
+## Co pamiętasz z dzisiaj?
+
+### Zapisz w notatkach jak najwięcej haseł
+
+
+1. dziedziczenie
+2. wielodziedziczenie
+3. funkcje czysto wirtualne
+4. klasy abstrakcyjne
+5. interfejsy
+6. funkcje wirtualne
+7. polimorfizm
+8. pola i metody statyczne
diff --git a/module2/09-homework.md b/module2/09-homework.md
new file mode 100644
index 000000000..d5c6cfaca
--- /dev/null
+++ b/module2/09-homework.md
@@ -0,0 +1,38 @@
+
+
+# Programowanie obiektowe
+
+## Praca domowa
+
+
+
+
+
+___
+
+### Pre-work
+
+* Dowiedz się czym jest problem diamentowy
+* Poczytaj o zasadach SOLID, dotyczących pisania dobrego kodu obiektowego
+* Spróbujcie w grupie metodą Copy & Paste dorzucić system budowania cmake do projektu. W tym celu popatrzcie na dotychczasowe zadania domowe i plik CMakeLists.txt.
+
+___
+
+### Post-work
+
+* Poczytaj o [Null object pattern](https://en.wikipedia.org/wiki/Null_object_pattern). Może się przydać w `university-db`
+* `university-db` ciąg dalszy (14 XP)
+
+___
+
+### `university-db`
+
+#### Wymagania (14 XP)
+
+* Przechowywanie rekordów pracowników uczelni o strukturze: imię, nazwisko, PESEL, płeć, adres, zarobki
+* Wszystkie osoby niezależnie czy będą to pracownicy, czy studenci mają być trzymani w jednym kontenerze
+* Wypełnianie bazy danych sztucznymi danymi (generowanie danych)
+* Modyfikacja zarobków wyszukując osobę po numerze PESEL (problematyczne)
+* Sortowanie po zarobkach (problematyczne)
+
+Natkniecie się tutaj na typowe problemy związane z projektowaniem kodu zorientowanego obiektowo. Pomyślcie wspólnie na Planningu lub podczas Daily jak je rozwiązać.
diff --git a/module2/presentation_homework.md b/module2/10-project.md
similarity index 67%
rename from module2/presentation_homework.md
rename to module2/10-project.md
index 13c848d34..86db524e5 100644
--- a/module2/presentation_homework.md
+++ b/module2/10-project.md
@@ -2,7 +2,7 @@
# Programowanie obiektowe
-## Podsumowanie
+## Projekt SHM
@@ -10,36 +10,11 @@
___
-## Co pamiętasz z dzisiaj?
-
-### Napisz na czacie jak najwięcej haseł
-
-
-1. dziedziczenie
-2. wielodziedziczenie
-3. funkcje wirtualne
-4. funkcje czysto wirtualne
-5. klasy abstrakcyjne
-6. interfejsy
-7. polimorfizm
-8. pola i metody statyczne
-
-___
-
-### Pre-work
-
-* Dowiedzcie się czym jest problem diamentowy
-* Poczytajcie o zasadach SOLID, dotyczących pisania dobrego kodu obiektowego
-* Lektura o wzorcach projektowych z przykładami w C++ - [refactoring.guru](https://refactoring.guru/design-patterns)
-* Spróbujcie w grupie metodą Copy & Paste dorzucić system budowania cmake do projektu. W tym celu popatrzcie na dotychczasowe zadania domowe i plik CMakeLists.txt.
-
-___
-
## Projekt grupowy
Wykorzystajcie kod napisany podczas zajęć. Możecie też skorzystać z kodu w katalogu [solutions](solutions)
-Projekt grupowy - kontynuacja. Możecie zmienić grupę jeśli chcecie ;)
+Kontynuujemy i rozwijamy dotychczasową aplikację 🙂
___
@@ -54,11 +29,11 @@ ___
### Punktacja
-* 3 pierwsze zadania - 5 punktów
+* zadania 1, 2, 3 - 5 punktów
* zadania 4, 5, 6 - 8 punktów
-* 20 punktów za dostarczenie wszystkich 6 zadań przed 05.07.2020 (niedziela) do 23:59
-* brak punktów bonusowych za dostarczenie tylko części zadań przed 05.07
-* 6 punktów za pracę w grupie dla każdej osoby z grupy.
+* 15 punktów za dostarczenie wszystkich 6 zadań przed 18.07.2020 (niedziela) do 23:59
+* brak punktów bonusowych za dostarczenie tylko części zadań w terminie
+* 6 punktów za pracę w grupie dla każdej osoby z grupy
___
diff --git a/module2/index.html b/module2/index.html
index aaabe3623..2f358c691 100644
--- a/module2/index.html
+++ b/module2/index.html
@@ -23,10 +23,10 @@
-
1. dziedziczenie
2. wielodziedziczenie
- 3. funkcje wirtualne
4. funkcje czysto wirtualne
5. klasy abstrakcyjne
6. interfejsy
+ 3. funkcje wirtualne
7. polimorfizm
8. pola i metody statyczne
- Możliwe, że dzisiaj nie przerobimy wszystkiego. Będzie na kolejną lekcję :)
-
-
-
-
-
-
-
-
-
@@ -89,23 +64,43 @@
Łukasz Ziobroń
You can change the port by using npm start -- --port=8001.
-->
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
diff --git a/module2/presentation_polymorphism.md b/module2/presentation_polymorphism.md
deleted file mode 100644
index 5e46c6f19..000000000
--- a/module2/presentation_polymorphism.md
+++ /dev/null
@@ -1,367 +0,0 @@
-
-
-# Programowanie obiektowe
-
-## Polimorfizm
-
-
-
-
-
-___
-
-## Słowo kluczowe `virtual`
-
-Jeżeli chcemy, aby przy używaniu wskaźników lub referencji na klasę bazową, jakaś metoda zachowywała się inaczej w zależności od prawdziwego typu obiektu, to należy ją oznaczyć słowem kluczowym `virtual`. Jest to tzw. funkcja wirtualna.
-
-___
-
-
-## Funkcja nie-wirtualna
-
-```cpp
-#include
-
-struct Bird {
- void sing() { std::cout << "tweet, tweet\n"; }
-};
-
-struct Sparrow : Bird {
- void sing() { std::cout << "chirp, chirp\n"; }
-};
-
-int main() {
- Sparrow sparrow;
- Bird& bird = sparrow;
- bird.sing();
- return 0;
-}
-```
-
-Co pojawi się na ekranie?
-
-
-`tweet, tweet`
-
-
-___
-
-
-## Funkcja wirtualna
-
-```cpp
-#include
-
-struct Bird {
- virtual void sing() { std::cout << "tweet, tweet\n"; }
-};
-
-struct Sparrow : Bird {
- void sing() { std::cout << "chirp, chirp\n"; }
-};
-
-int main() {
- Sparrow sparrow;
- Bird& bird = sparrow;
- bird.sing();
- return 0;
-}
-```
-
-Co pojawi się na ekranie?
-
-
-`chirp, chirp`
-
-
-[Sprawdź na ideone.com](https://ideone.com/yW43Tq)
-
-
-___
-
-## Słowo kluczowe `override`
-
-Jeżeli w klasie pochodnej **nadpisujemy** metodę wirtualną, czyli zmieniamy jej zachowanie, to należy dodać słowo `override`.
-
-
-```cpp
-class Interface {
-public:
- virtual void doSth() = 0;
-};
-
-class SomeClass : public Interface {
-public:
- void doSth() override; // there should be an implementation in cpp file
-};
-
-int main() {
- // Interface interface; // Compilation error, Interface is pure virtual
- SomeClass someClass; // OK
- Interface* interface = &someClass; // OK, we hold a pointer
-}
-```
-
-
-___
-
-### Mała uwaga
-
-`override` jest opcjonalne. Jeśli go nie podamy za sygnaturą funkcji klasy pochodnej to metoda z klasy bazowej i tak zostanie nadpisana.
-
-
-Jego użycie jest jednak dobrą praktyką, bo dzięki niemu kompilator sprawdzi czy faktycznie nadpisujemy metodę z klasy bazowej i jeśli nie, to program się nie skompiluje.
-
-
-Bez `override` mogłaby zostać utworzona nowa metoda w klasie pochodnej, która nie nadpisuje niczego z klasy bazowej.
-
-
-Metody wirtualne **nadpisujemy**, nie przeciążamy.
-
-
-___
-
-## Nadpisywanie metod - `override`
-
-Wracając do przykładu o ptakach, klasy `Penguin`, `Hummingbird` oraz `Goose` to klasy pochodne, które dziedziczą po pewnych klasach bazowych jak `Bird`, `Flyable`, `Soundable`, `Swimmable` oraz nadpisują kilka ich metod jak:
-
-* void eat() override
-* void sleep() override
-* void makeSound() override
-* void fly() override
-* void swim() override
-
-Nadpisanie takich metod powoduje, że możemy zmienić ich implementacje.
-
-
-___
-
-## `override`
-
-```cpp
-class Soundable {
-public:
- virtual void makeSound() = 0;
-};
-```
-
-```cpp
-class Goose : public Soundable {
-public:
- void makeSound() override { std::cout << "Honk! Honk!"; }
-};
-```
-
-```cpp
-class Hen : public Soundable {
-public:
- void makeSound() override { std::cout << "Cluck! Cluck!"; }
-};
-```
-
-```cpp
-class Duck : public Soundable {
-public:
- void makeSound() override { std::cout << "Quack! Quack!"; }
-};
-```
-
-___
-
-## Wspólna klasa bazowa
-
-Ponieważ wspólnym rodzicem wszystkich klas jest klasa `Soundable` możemy przechowywać w kontenerze wskaźniki typu `Soundable`.
-
-```cpp
-std::vector> birds_;
-```
-
-### Jakie dane otrzymamy na wyjściu?
-
-```cpp
-std::vector> birds_;
-birds_.push_back(std::make_shared());
-birds_.push_back(std::make_shared());
-birds_.push_back(std::make_shared());
-
-std::cout << birds_[0]->makeSound() << '\n';
-std::cout << birds_[1]->makeSound() << '\n';
-std::cout << birds_[2]->makeSound() << '\n';
-```
-
-
-___
-
-## Polimorfizm
-
-Zjawisko, które właśnie zaobserwowaliśmy, nazywa się polimorfizmem.
-
-Polimorfizm pozwala funkcji przybrać różne formy (implementacje), tak jak na przykładzie.
-
-
-Dlatego, jeżeli utworzymy kolejno obiekty `Goose`, `Hen` i `Duck` w zależności od obiektu zostanie wywołana jego wersja metody `makeSound`.
-
-
-Polimorfizm włącza się, gdy mamy funkcje wirtualne i używamy wskaźników lub referencji na typ bazowy.
-
-
-### Kto grał lub czytał Wiedźmina?
-
-
-___
-
-## Doppler :)
-
-W uniwersum wykreowanym przez naszego rodzimego pisarza Andrzeja Sapkowskiego, występuje pewna intrygująca i ciekawa rasa zwana Dopplerami.
-
-
-Rasa ta potrafi przyjąć, postać różnych form życia, może stać się człowiekiem, elfem, krasnoludem. Zmienia w ten sposób swoje cechy jak głos, kolor włosów, a nawet ubranie!
-
-
-Pomimo że rasa ta jest typu Doppler, potrafi w różnych okolicznościach podszywać się pod inne rasy jak elf, krasnolud czy człowiek.
-
-
-Z punktu widzenia C++ nasz Doppler podlega zjawisku polimorfizmu.
-
-
-___
-
-
-```cpp
-class Doppler {
-public:
- virtual sayHello() { std::cout << "I'm Doppler!"; }
-};
-
-class Dwarf : public Doppler {
-public:
- virtual sayHello() { std::cout << "I'm Dwarf!"; }
-};
-
-class Elf : public Doppler {
-public:
- virtual sayHello() { std::cout << "I'm Elf!"; }
-};
-
-class Human : public Doppler {
-public:
- virtual sayHello() { std::cout << "I'm Human!"; }
-};
-
-int main() {
- std::shared_ptr doppler1 = std::make_shared();
- std::shared_ptr doppler2 = std::make_shared();
- std::shared_ptr doppler3 = std::make_shared();
-
- std::cout << doppler1->sayHello() << '\n';
- std::cout << doppler2->sayHello() << '\n';
- std::cout << doppler3->sayHello() << '\n';
-}
-```
-
-
-
-Jak widzimy, nasz Doppler może przyjąć różne formy i zachowywać się tak jak one. Wskaźnik jest typu Doppler, ale program dobrze wie, kiedy Doppler podszywa się pod człowieka, kiedy pod krasnoluda, a kiedy pod elfa.
-
-___
-
-
-## Nie-wirtualne destruktory
-
-Bardzo ważne w przypadku tworzenia metod wirtualnych i dziedziczenia jest tworzenie wirtualnych destruktorów.
-Jeżeli korzystamy z dobroci polimorfizmu i nie oznaczymy destruktor jako `virtual` to destruktor ten nie zostanie wywołany.
-
-```cpp
-#include
-#include
-
-class Parent {
-public:
- Parent() { std::cout << "PARENT C'tor called\n"; }
- ~Parent() { std::cout << "PARENT D'tor caller\n"; }
-};
-
-class Child : public Parent {
-public:
- Child() { std::cout << "CHILD C'tor called\n"; }
- ~Child() { std::cout << "CHILD D'tor caller\n"; }
-};
-
-int main() {
- Child child; // ok, object on stack, not a pointer
-}
-```
-
-___
-
-## Nie-wirtualne destruktory - problem
-
-```cpp
-#include
-#include
-#include
-
-class Parent {
-public:
- Parent() { std::cout << "PARENT C'tor called\n"; }
- ~Parent() { std::cout << "PARENT D'tor caller\n"; }
-};
-
-class Child : public Parent {
-public:
- Child() { std::cout << "CHILD C'tor called\n"; }
- ~Child() { std::cout << "CHILD D'tor caller\n"; }
-};
-
-int main() {
- // Problem
- std::unique_ptr child = std::make_unique();
-
- // But shared_ptr will cleanup properly
- std::shared_ptr child2 = std::make_shared();
-}
-```
-
-___
-
-## Wirtualny destruktor
-
-```cpp
-#include
-#include
-#include
-
-class Parent {
-public:
- Parent() { std::cout << "PARENT C'tor called\n"; }
- virtual ~Parent() { std::cout << "PARENT D'tor caller\n"; }
-};
-
-class Child : public Parent {
-public:
- Child() { std::cout << "CHILD C'tor called\n"; }
- ~Child() override { std::cout << "CHILD D'tor caller\n"; }
-};
-
-int main() {
- std::unique_ptr child2 = std::make_unique();
-}
-```
-
-___
-
-## Q&A
-
-___
-
-## Zadanie 3
-
-Napisz klasę `DryFruit`, która dziedziczyć będzie po klasie `Fruit`.
-
-Klasa ta powinna nadpisywać metody `getPrice()`, `getName()` oraz `operator--`.
-
-`operator--` powinien odejmować zużycie raz na 10 wywołań.
-
-Metoda `getPrice()` powinna zwracać trzykrotnie większą wartość w porównaniu do ceny bazowej.
-
-Przetestuj wywołania polimorficzne oraz podziel się wnioskami.
diff --git a/module2/presentation_solutions.md b/module2/presentation_solutions.md
index 708e7969e..e090368cf 100644
--- a/module2/presentation_solutions.md
+++ b/module2/presentation_solutions.md
@@ -10,6 +10,12 @@
___
+## Disclaimer
+
+W PDFie te rozwiązania mogą być częściowo ucięte. Przejdź do lekcji na platformie lub na GitHubie, aby zobaczyć je w całości.
+
+___
+
### Zadanie 1
Cargo.hpp
@@ -247,11 +253,11 @@ Cargo* Player::getCargo(size_t index) const {
}
size_t Player::getAvailableSpace() const {
- size_t total_cargo_amount = 0;
+ available_space_ = 0;
for (const auto cargo : ship_->getCargos()) {
- total_cargo_amount += cargo->getAmount();
+ available_space_ += cargo->getAmount();
}
- available_space_ = ship_->getCapacity() - total_cargo_amount;
+
return available_space_;
}
```
diff --git a/module2/solutions/exercise2.cpp b/module2/solutions/exercise2.cpp
deleted file mode 100644
index 2db682909..000000000
--- a/module2/solutions/exercise2.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-#include
-#include
-
-class Cargo;
-
-class Ship {
-public:
- void Load(std::unique_ptr cargo) {
- if (auto match_cargo = FindMatchCargo(cargo.get())) {
- *match_cargo += cargo->GetAmount();
- return;
- }
- cargo_.push_back(std::move(cargo));
- }
-
- void Unload(Cargo* cargo) {
- RemoveFromStorage(cargo);
- }
-
- Cargo* FindMatchCargo(Cargo* cargo) {
- for (auto el : cargo_) {
- if (el->GetName() == "Fruit") {
- if (el->GetName() == cargo->GetName() &&
- el->GetBasePrice() == cargo->GetBasePrice() &&
- el->GetExpiryDate() == cargo->GetExpiryDate())
- return el.get();
- } else if (el->GetName() == "Alcohol") {
- if (el->GetName() == cargo->GetName() &&
- el->GetBasePrice() == cargo->GetBasePrice() &&
- el->GetPercentage() == cargo->GetPercentage())
- return el.get();
- } else {
- if (el->GetName() == cargo->GetName() &&
- el->GetBasePrice() == cargo->GetBasePrice() &&
- el->GetRarity() == cargo->GetRarity())
- return el.get();
- }
- }
- }
-
- void RemoveFromStorage(Cargo* cargo) {
- cargo_.erase(std::find_if(std::begin(cargo_), std::end(cargo_),
- [cargo](const auto& el) {
- return *el == *cargo;
- }));
- }
-};
diff --git a/module2/solutions/exercise1.cpp b/module2/solutions/exercise5.cpp
similarity index 65%
rename from module2/solutions/exercise1.cpp
rename to module2/solutions/exercise5.cpp
index a25ebf118..cc652dedc 100644
--- a/module2/solutions/exercise1.cpp
+++ b/module2/solutions/exercise5.cpp
@@ -6,10 +6,10 @@ class Cargo {
Cargo(size_t amount, std::string name, size_t base_price);
virtual ~Cargo() = default;
- virtual size_t GetPrice() const = 0;
- virtual std::string GetName() const = 0;
- virtual size_t GetAmount() const = 0;
- virtual size_t GetBasePrice() const = 0;
+ virtual size_t getPrice() const = 0;
+ virtual std::string getName() const = 0;
+ virtual size_t getAmount() const = 0;
+ virtual size_t getBasePrice() const = 0;
virtual Cargo& operator+=(size_t amount) = 0;
virtual Cargo& operator-=(size_t amount) = 0;
@@ -25,15 +25,15 @@ class Fruit : public Cargo {
~Fruit() override;
// override from Cargo
- size_t GetPrice() const override {
+ size_t getPrice() const override {
if (time_elapsed_ >= expiry_date_)
return 0;
return static_cast(
base_price_ * ((float)(expiry_date_ - time_elapsed_)) / expiry_date_);
}
- std::string GetName() const override { return name_; }
- size_t GetAmount() const override { return amount_; }
- size_t GetBasePrice() const override { return base_price_; }
+ std::string getName() const override { return name_; }
+ size_t getAmount() const override { return amount_; }
+ size_t getBasePrice() const override { return base_price_; }
Cargo& operator--() {
--amount_;
return *this;
@@ -47,8 +47,8 @@ class Fruit : public Cargo {
return *this;
}
- size_t GetTimeElapsed() const { return time_elapsed_; }
- size_t GetExpiryDate() const { return expiry_date_; }
+ size_t getTimeElapsed() const { return time_elapsed_; }
+ size_t getExpiryDate() const { return expiry_date_; }
private:
size_t time_elapsed_{0};
@@ -61,10 +61,10 @@ class Alcohol : public Cargo {
~Alcohol() override = default;
// override from Cargo
- size_t GetPrice() const override { return base_price_ * percentage_ / 96; }
- std::string GetName() const override { return name_; }
- size_t GetAmount() const override { return amount_; }
- size_t GetBasePrice() const override { return base_price_; }
+ size_t getPrice() const override { return base_price_ * percentage_ / 96; }
+ std::string getName() const override { return name_; }
+ size_t getAmount() const override { return amount_; }
+ size_t getBasePrice() const override { return base_price_; }
Cargo& operator+=(size_t amount) {
amount_ += amount;
return *this;
@@ -74,7 +74,7 @@ class Alcohol : public Cargo {
return *this;
}
- size_t GetPercentage() const { return percentage_; }
+ size_t getPercentage() const { return percentage_; }
private:
size_t percentage_;
@@ -91,10 +91,10 @@ class Item : public Cargo {
~Item() override = default;
// override from Cargo
- size_t GetPrice() const override { return base_price_ * static_cast(rarity_); }
- std::string GetName() const override { return name_; }
- size_t GetAmount() const override { return amount_; }
- size_t GetBasePrice() const override { return base_price_; }
+ size_t getPrice() const override { return base_price_ * static_cast(rarity_); }
+ std::string getName() const override { return name_; }
+ size_t getAmount() const override { return amount_; }
+ size_t getBasePrice() const override { return base_price_; }
Cargo& operator+=(size_t amount) {
amount_ += amount;
return *this;
@@ -104,7 +104,7 @@ class Item : public Cargo {
return *this;
}
- Rarity GetRarity() const { return rarity_; }
+ Rarity getRarity() const { return rarity_; }
private:
Rarity rarity_;
diff --git a/module2/solutions/exercise6.cpp b/module2/solutions/exercise6.cpp
new file mode 100644
index 000000000..7374f04ff
--- /dev/null
+++ b/module2/solutions/exercise6.cpp
@@ -0,0 +1,47 @@
+#include
+#include
+
+class Cargo;
+
+class Ship {
+public:
+ void load(std::unique_ptr cargo) {
+ if (auto match_cargo = findMatchCargo(cargo.get())) {
+ *match_cargo += cargo->getAmount();
+ return;
+ }
+ cargo_.push_back(std::move(cargo));
+ }
+
+ void unload(Cargo* cargo) {
+ removeFromStorage(cargo);
+ }
+
+ Cargo* findMatchCargo(Cargo* cargo) {
+ for (auto el : cargo_) {
+ if (el->getName() == "Fruit") {
+ if (el->getName() == cargo->getName() &&
+ el->getBasePrice() == cargo->getBasePrice() &&
+ el->getExpiryDate() == cargo->getExpiryDate())
+ return el.get();
+ } else if (el->getName() == "Alcohol") {
+ if (el->getName() == cargo->getName() &&
+ el->getBasePrice() == cargo->getBasePrice() &&
+ el->getPercentage() == cargo->getPercentage())
+ return el.get();
+ } else {
+ if (el->getName() == cargo->getName() &&
+ el->getBasePrice() == cargo->getBasePrice() &&
+ el->getRarity() == cargo->getRarity())
+ return el.get();
+ }
+ }
+ }
+
+ void removeFromStorage(Cargo* cargo) {
+ cargo_.erase(std::find_if(std::begin(cargo_), std::end(cargo_),
+ [cargo](const auto& el) {
+ return *el == *cargo;
+ }));
+ }
+};
diff --git a/module2/solutions/exercise3.cpp b/module2/solutions/exercise7.cpp
similarity index 83%
rename from module2/solutions/exercise3.cpp
rename to module2/solutions/exercise7.cpp
index d64f85256..c4b1e74d0 100644
--- a/module2/solutions/exercise3.cpp
+++ b/module2/solutions/exercise7.cpp
@@ -4,8 +4,8 @@
class DryFruit : public Fruit {
public:
// override from Cargo
- std::string GetName() const override { return "Dry Fruit"; }
- size_t GetPrice() const override {
+ std::string getName() const override { return "Dry Fruit"; }
+ size_t getPrice() const override {
if (time_elapsed_ >= expiry_date_)
return 0;
return static_cast(
diff --git a/module2/solutions/exercise4.cpp b/module2/solutions/exercise8.cpp
similarity index 89%
rename from module2/solutions/exercise4.cpp
rename to module2/solutions/exercise8.cpp
index a31dbd455..0963db555 100644
--- a/module2/solutions/exercise4.cpp
+++ b/module2/solutions/exercise8.cpp
@@ -6,7 +6,7 @@ class Coordinates {
Coordinates() = default;
Coordinates(size_t pos_x, size_t pos_y)
: pos_x_(pos_x), pos_y_(pos_y) {}
- static size_t Distance(const Coordinates& lhs, const Coordinates& rhs) {
+ static size_t distance(const Coordinates& lhs, const Coordinates& rhs) {
return std::sqrt(std::pow((int)lhs.pos_x_ - (int)rhs.pos_x_, 2) + std::pow((int)lhs.pos_y_ - (int)rhs.pos_y_, 2));
}
bool operator==(const Coordinates& lhs) const {
diff --git a/module3/index.html b/module3/index.html
deleted file mode 100644
index 1712af944..000000000
--- a/module3/index.html
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
-
- Object Oriented Programming - Coders School
-
-
-
-
-
-
-
-
-
-
-
-
-
-