Skip to content

Commit 075cada

Browse files
committed
Module4 revamped
1 parent 0e39179 commit 075cada

14 files changed

+331
-135
lines changed

module4/01-pillars.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!-- .slide: data-background="#111111" -->
2+
3+
# 4 filary obiektowości
4+
5+
___
6+
7+
## 4 filary obiektowości
8+
9+
* <!-- .element: class="fragment fade-in" --> Abstrakcja
10+
* <!-- .element: class="fragment fade-in" --> Enkapsulacja
11+
* <!-- .element: class="fragment fade-in" --> Dziedziczenie
12+
* <!-- .element: class="fragment fade-in" --> Polimorfizm

module4/02-abstraction.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<!-- .slide: data-background="#111111" -->
2+
3+
# Abstrakcja
4+
5+
___
6+
7+
## Abstrakcja
8+
9+
* <!-- .element: class="fragment fade-in" --> Interfejs
10+
* <!-- .element: class="fragment fade-in" --> Publiczna część klasy
11+
* <!-- .element: class="fragment fade-in" --> Metody (Member functions)
12+
* <!-- .element: class="fragment fade-in" --> Funkcje spoza klasy (Non-member functions)
13+
* <!-- .element: class="fragment fade-in" --> Typy wewnętrzne (Member types)
14+
* <!-- .element: class="fragment fade-in" --> Wewnętrzne pola (Member fields)
15+
* <!-- .element: class="fragment fade-in" --> Parametry szablonowe (Template parameters)
16+
* <!-- .element: class="fragment fade-in" --> Specjalizacje
17+
* <!-- .element: class="fragment fade-in" --> Przykład: <a href="https://en.cppreference.com/w/cpp/container/vector"><code>std::vector</code> na cppreference.com</a>
18+
* <!-- .element: class="fragment fade-in" --> Część prywatna (implementacja) jest nieznana
19+
* <!-- .element: class="fragment fade-in" --> Object Oriented Design (OOD)
20+
21+
> Make interfaces easy to use correctly and hard to use incorrectly
22+
>
23+
> \-\- Scott Meyers, [Effective C++](https://blog.ycshao.com/2012/11/23/effective-c-item-18-make-interfaces-easy-to-use-correctly-and-hard-to-use-incorrectly/)
24+
<!-- .element: class="fragment fade-in" -->
25+
26+
___
27+
28+
## Przykład złego interfejsu
29+
30+
```c++
31+
// A date class which is easy to use but also easy to use wrong.
32+
class Date {
33+
public:
34+
Date(int month, int day, int year);
35+
...
36+
};
37+
38+
// Both are ok, but some european programmer may use it wrong,
39+
// because european time format is dd/mm/yyyy instead of mm/dd/yyyy.
40+
Date d(3, 4, 2000);
41+
Date d(4, 3, 2000);
42+
```
43+
44+
Jak można ulepszyć klasę `Date`? Napisz w komentarzu 🙂
45+
<!-- .element: class="fragment fade-in" -->

module4/03-encapsulation.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!-- .slide: data-background="#111111" -->
2+
3+
# Enkapsulacja
4+
5+
___
6+
7+
## Enkapsulacja
8+
9+
* <!-- .element: class="fragment fade-in" --> Specyfikatory zakresu
10+
* <!-- .element: class="fragment fade-in" --> <code>public</code> - domyślny dla <code>struct</code>
11+
* <!-- .element: class="fragment fade-in" --> <code>protected</code>
12+
* <!-- .element: class="fragment fade-in" --> <code>private</code> - domyślny dla <code>class</code>
13+
* <!-- .element: class="fragment fade-in" --> Settery i gettery
14+
* <!-- .element: class="fragment fade-in" --> Nienazwane <code>namespace</code>

module4/04-inheritance.md

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<!-- .slide: data-background="#111111" -->
2+
3+
# Dziedziczenie
4+
5+
___
6+
7+
## Kolejność wywołań konstruktorów i destruktorów
8+
9+
* <!-- .element: class="fragment fade-in" --> Konstruktory - najpierw klasa bazowa, potem pochodna
10+
* <!-- .element: class="fragment fade-in" --> Destruktory - zawsze w odwrotnej kolejności niż konstruktory
11+
* <!-- .element: class="fragment fade-in" --> <a href="https://ideone.com/Kgb46n">Birthday cake</a>
12+
13+
___
14+
15+
### Co wyświetli się na ekranie?
16+
17+
```cpp
18+
#include <iostream>
19+
20+
using namespace std;
21+
22+
class Chocolate {
23+
public:
24+
Chocolate() { cout << "Chocolate ctor" << endl; }
25+
~Chocolate() { cout << "Chocolate dtor" << endl; }
26+
};
27+
28+
class ChocolateCake {
29+
public:
30+
ChocolateCake() { cout << "ChocolateCake ctor" << endl; }
31+
~ChocolateCake() { cout << "ChocolateCake dtor" << endl; }
32+
private:
33+
Chocolate chocolate;
34+
};
35+
36+
class Candles {
37+
public:
38+
Candles() { cout << "Candles ctor" << endl; }
39+
~Candles() { cout << "Candles dtor" << endl; }
40+
};
41+
42+
class BirthdayCake : public ChocolateCake {
43+
public:
44+
BirthdayCake() { cout << "BirthdayCake ctor" << endl; }
45+
~BirthdayCake() { cout << "BirthdayCake dtor" << endl; }
46+
private:
47+
Candles candles;
48+
};
49+
50+
int main(int argc, char *argv[]) {
51+
BirthdayCake birthdayCake;
52+
return 0;
53+
}
54+
```
55+
56+
#### Napisz w komentarzu 🙂
57+
<!-- .element: class="fragment fade-in" -->
58+
59+
___
60+
61+
## `private` czy `public`?
62+
63+
* <!-- .element: class="fragment fade-in" --> Dziedziczenie <code>class</code> po <code>struct</code> jest...?
64+
65+
```cpp
66+
struct A { int a; };
67+
class B : A {};
68+
int main() {
69+
B item;
70+
item.a = 5;
71+
}
72+
```
73+
74+
* <!-- .element: class="fragment fade-in" --> <a href="https://ideone.com/NCxKcA"><code>private</code></a>
75+
* <!-- .element: class="fragment fade-in" --> <code>error: ‘int A::a’ is inaccessible within this context</code>
76+
77+
___
78+
79+
## `private` czy `public`?
80+
81+
* <!-- .element: class="fragment fade-in" --> Dziedziczenie <code>struct</code> po <code>class</code> jest...?
82+
83+
```cpp
84+
class A {
85+
public:
86+
int a;
87+
};
88+
struct B : A {};
89+
90+
int main() {
91+
B item;
92+
item.a = 5;
93+
}
94+
```
95+
96+
* <!-- .element: class="fragment fade-in" --> <a href="https://ideone.com/x46OvN"><code>public</code></a>
97+
98+
___
99+
100+
## Inheritance access modifiers
101+
102+
| | <code>public</code> | <code>protected</code> | <code>private</code> |
103+
| :------------------------: | :-------------------------------------------------------: | :-------------------------------------------------------: | :-----------------------------------------------------: |
104+
| **<code>public</code>** | public <!-- .element style="background-color: #0a0;"--> | protected<!-- .element style="background-color: #da0;"--> | private<!-- .element style="background-color: #a00;"--> |
105+
| **<code>protected</code>** | protected<!-- .element style="background-color: #da0;"--> | protected<!-- .element style="background-color: #da0;"--> | private<!-- .element style="background-color: #a00;"--> |
106+
| **<code>private</code>** | private <!-- .element style="background-color: #a00;"--> | private <!-- .element style="background-color: #a00;"--> | private<!-- .element style="background-color: #a00;"--> |
107+
108+
___
109+
110+
## Problem diamentowy
111+
112+
```text
113+
A Animal
114+
/ \ / \
115+
B C Mammal Fish
116+
\ / \ /
117+
D Dolphin
118+
```
119+
120+
* <!-- .element: class="fragment fade-in" --> Deadly Diamond of Death
121+
* <!-- .element: class="fragment fade-in" --> Wirtualne dziedziczenie
122+
* <!-- .element: class="fragment fade-in" --> <code>class B : virtual public A</code>
123+
* <!-- .element: class="fragment fade-in" --> <code>class C : virtual public A</code>
124+
* <!-- .element: class="fragment fade-in" --> <code class="fragment highlight-red">class D : virtual public B, virtual public C</code>

module4/05-polymorphism.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<!-- .slide: data-background="#111111" -->
2+
3+
# Polimorfizm
4+
5+
___
6+
7+
## Polimorfizm
8+
9+
* <!-- .element: class="fragment fade-in" --> Funkcje wirtualne
10+
* <!-- .element: class="fragment fade-in" --> Funkcje czysto wirtualne (<code>=0</code>)
11+
* <!-- .element: class="fragment fade-in" --> Klasy abstrakcyjne
12+
* <!-- .element: class="fragment fade-in" --> mają co najmniej jedną funkcję czysto wirtualną
13+
* <!-- .element: class="fragment fade-in" --> <code>vtable</code> and <code>vptr</code>
14+
* <!-- .element: class="fragment fade-in" --> implementacja polimorfizmu w C++
15+
* <!-- .element: class="fragment fade-in" --> konstruktor klasy pochodnej nadpisuje wskaźniki na funkcje klas bazowych w <code>vtable</code>

module4/exercise_cars.md renamed to module4/06-exercise-cars.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!-- .slide: data-background="#111111" -->
22

3-
# Exercise
3+
# Zadanie
44

55
___
66

module4/07-insights.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<!-- .slide: data-background="#111111" -->
2+
3+
# 🎭 Co siedzi pod maską?
4+
5+
___
6+
7+
## Układ klas w pamięci
8+
9+
* użycie słowa <code>virtual</code> powoduje wygenerowanie dodatkowego pola <code>vptr</code> oraz zaalokowania na stercie <code>vtable</code>
10+
11+
```cpp
12+
class A {
13+
virtual void f();
14+
virtual void g();
15+
int a;
16+
};
17+
```
18+
19+
```text
20+
stos: | *vptr | int a |
21+
|
22+
V
23+
sterta: | void (*f)() | void (*g)() |
24+
| |
25+
V V
26+
A::f A::g
27+
```
28+
29+
___
30+
31+
## Układ klas w pamięci
32+
33+
```cpp
34+
class A { int a; };
35+
class B : public A { int b; };
36+
class C : public A { int c; };
37+
class D : public B, public C { int d; };
38+
```
39+
40+
```text
41+
| int a | int b | int a | int c | int d |
42+
^-------^ ^-------^
43+
A A
44+
^---------------^---------------^
45+
B C
46+
^---------------------------------------^
47+
D
48+
```
49+
50+
___
51+
52+
## Układ klas w pamięci
53+
54+
### Dziedziczenie wirtualne
55+
56+
* użycie wirtualnego dziedziczenie powoduje, że będzie tylko jedna instancja obiektu klasy bazowej
57+
58+
```cpp
59+
class A { int a; };
60+
class B : public virtual A { int b; };
61+
class C : public virtual A { int c; };
62+
class D : public B, public C { int d; };
63+
```
64+
65+
```text
66+
| int a | int b | int c | int d |
67+
^-------^-------^-------^
68+
A B C
69+
^-------------------------------^
70+
D
71+
```
72+
73+
___
74+
75+
## Name mangling
76+
77+
* <!-- .element: class="fragment fade-in" --> overloading = name mangling
78+
* <!-- .element: class="fragment fade-in" --> <code>c++filt</code> odkodowuje nazwy symboli
79+
* <code>f()</code> -> <code>_Z1fv</code>
80+
* <code>f(int a, double b)</code> -> <code>_Z1fid</code>
81+
* <!-- .element: class="fragment fade-in" --> Zobacz w <a href="https://godbolt.org">godbolt.org</a>
82+
83+
___
84+
85+
## Metody
86+
87+
* <!-- .element: class="fragment fade-in" --> metody to funkcje z ukrytym argumentem - wskaźnik <code>this</code>
88+
* <!-- .element: class="fragment fade-in" --> metody <code>const</code> to po prostu wskaźnik <code>this</code> na stały obiekt klasy
89+
90+
```cpp
91+
class Ex {
92+
int a;
93+
public:
94+
void setA(int aa);
95+
int getA() const;
96+
};
97+
```
98+
<!-- .element: class="fragment fade-in" -->
99+
100+
```cpp
101+
class Ex {
102+
int a;
103+
}
104+
void setA(Ex* this, int aa);
105+
int getA(const Ex* this);
106+
```
107+
<!-- .element: class="fragment fade-in" -->

module4/post_work.md renamed to module4/08-homework.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,4 @@ You can work in groups or individually. Fork the Cars repo and submit a Pull Req
1313
3. <!-- .element: class="fragment fade-in" --> (10 XP - optional) Write a proper unit tests to this code
1414
4. <!-- .element: class="fragment fade-in" --> Read one of below articles. It will be useful for the next lesson
1515

16-
* <!-- .element: class="fragment fade-in" --> <a href="https://www.samouczekprogramisty.pl/solid-czyli-dobre-praktyki-w-programowaniu-obiektowym/">SOLID czyli dobre praktyki w programowaniu obiektowym</a> (in Polish)
17-
* <!-- .element: class="fragment fade-in" --> <a href="https://scotch.io/bar-talk/s-o-l-i-d-the-first-five-principles-of-object-oriented-design">S.O.L.I.D: The First 5 Principles of Object Oriented Design</a> (in English)
16+
* <!-- .element: class="fragment fade-in" --> <a href="https://www.samouczekprogramisty.pl/solid-czyli-dobre-praktyki-w-programowaniu-obiektowym/">SOLID czyli dobre praktyki w programowaniu obiektowym</a>

module4/abstraction.md

Lines changed: 0 additions & 42 deletions
This file was deleted.

module4/encapsulation.md

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)