rexroth2023-08
C++FOR Onsite @ Rexroth, Lohr am Main
Infografiken des Trainers: https://tbfe.de/data/uploads/infographics
Praktikum für Montag
- Umsetzung des Zustandsdiagramms "Chess-Clock" basierend auf einer der vorgestellten FSM-Implementierungen
- State-Diagramm für Übung ChessClock_FSM
https://docs.google.com/drawings/d/1dW_rRw-wahoCTAs-s0nwaRwFnYsvNkUntZDnvwbq9wc/edit?usp=sharing - Darauf basierend folgende Anpassungen der ...
- ... notwendigen Zustände und Übergänge
- ... Test-Steuerung (Wirkung der Eingaben 'A', 'B', 'C' ...)
- State-Diagramm für Übung ChessClock_FSM
Praktika ab Dienstag
- Kapitel Exercise Seiten CLKOBS-3 bis CLKOBS-9
Überblick über Gesamtstruktur des Projekts inklusive der abweichenden Umsetzungen in der "onlineGDB"-Implementierung, in welcher schließlich die TBD-s zu ergänzen sind.- keine Packages / Namespace
- stark vereinfachtes Testverfahren
- die Seiten CLKOBS-10 bis CLKOBS-13 sind nicht relevant
- zu TBD-s siehe https://onlinegdb.com/LYnhCmek0 (dann FORK klicken)
- Lösung siehe https://onlinegdb.com/n4osgLQBN
- https://onlinegdb.com/UnJSDzvwV
=> zugleich Ausgangspunkt für den folgenden Schritt (FORK klicken)
- Kapitel Exercise Seiten CLKOBS-14 bis CLKOBS-17
- Tests nur manuell
- Lösung siehe https://onlinegdb.com/ojWoZtc9a
- Kapitel Exercise Seiten CLKOBS-18 bis CLKOBS-26
- Ausgangspunkte: (jeweils FORK klicken)
- Sub-Schritt F-21: https://onlinegdb.com/QI3np4N8K
- siehe TBD in `observer_array.h`
- Lösung (bis inkl. CLKOBS-21): https://onlinegdb.com/8t9AZubrL
- Sub-Schritt F-22: https://onlinegdb.com/K8nu0Zb4f
siehe TBD in `observer_array.h` - Sub-Schritt F-23: https://onlinegdb.com/e8gwi-TdT
siehe TBD in `timer.h` - Sub-Schritt F-24: https://onlinegdb.com/LSlOowGCu
siehe TBD in `clock.h` - Sub-Schritt F-25: https://onlinegdb.com/l1wxneQZM
siehe TBD in `main.cpp` - Sub-Schritt F-26: https://onlinegdb.com/N80scH3N4
siehe TBD in `main.cpp`
- Sub-Schritt F-22: https://onlinegdb.com/K8nu0Zb4f
- Lösung (bis inkl. CLKOBS-26): https://onlinegdb.com/_EkOkQoQW
- optionale Alternativen - nicht Teil der Aufgabenstellung
- Ausgangspunkte: (jeweils FORK klicken)
- Kapitel Exercise Seiten CLKOBS-27 bis CLKOBS-30
- Ausgangspunkt: https://onlinegdb.com/Y27OVMj_r (dann FORK klicken)
- Lösung siehe: https://onlinegdb.com/rBeSmY5rp
- Ausgangspunkt: https://onlinegdb.com/Y27OVMj_r (dann FORK klicken)
- Kapitel Exercise Seiten CLKOBS-31 bis CLKOBS-37
- Ausgangspunkt: https://onlinegdb.com/GBR41eqbC (dann FORK klicken)
- Lösung siehe: https://onlinegdb.com/kqgturXm0
- Optionale Ergänzung: Mutex als Schutz gegen Race-Condition
- Ausgangspunkt: https://onlinegdb.com/8Oww0C_cSl (dann FORK klicken)
- Lösung siehe: https://onlinegdb.com/WHtZuWwDy
Demos mit Online-Compiler
Kapitel Basics Refreshments:
- 2.1 Null Pointer Type
- 2.5 Strongly Type Enumeration (zu Seite BASICS-14):
- https://godbolt.org/z/h1n93dTzb
reichlich kommentiertes Multi-File Beispiel zu "Fowarding"-Header für Aufzählungstypen (funktioniert für `enum` wie auch für ´enum class`)
- https://godbolt.org/z/h1n93dTzb
- 3.2 C++ Header File
- https://godbolt.org/z/17Tbvx8MM
`const` für Member-Funktionen
- https://godbolt.org/z/17Tbvx8MM
- 3.4.1 Uniform Initialization
- 3.4.1 `std::intializer_list`
- 5.1 Example Finite State Machine (zu Seiten BASICS-40...46):
- https://godbolt.org/z/hsrYvb
- https://godbolt.org/z/bn9aKnq1q
wie in Schulungsunterlage mit minimalen Modifikationen - https://godbolt.org/z/rsne7M
neue `using`-Syntax für Typ-Definitionen und
pflegeleichteres(?) "state to string" mapping - https://godbolt.org/z/GYT1hj
Transition-Table als `std::unordered_map` mit Zustand als "Key"
sowie Check-/Action-Funktionen und Folgezustand "Value" - https://godbolt.org/z/PnY9Ks
- https://godbolt.org/z/1bahYPY8d
EINE Transition-Table pro Zustand und Übergänge nur aus diesem EINEN Zustand
- 9.1 Compile Time Constants
- ...(TBD)...
- 9.2.4 User Defined Literals
- ...(TBD)...
Kapitel Exceptions
- https://godbolt.org/z/A6bg9U (copy-paste EX-15...18)
- https://godbolt.org/z/S4op5a (copy-paste EX-21...24)
- https://godbolt.org/z/ve-bBX (copy-paste EX-25)
- https://godbolt.org/z/m7K92A (copy-paste EX-26)
- https://godbolt.org/z/iYJ4yJ (copy-paste EX-27)
- https://godbolt.org/z/WquFzw (copy-paste EX-30...33)
- https://godbolt.org/z/5rz1jdWhr (Variante mit `std::out_of_range`)
- https://godbolt.org/z/XHtBLn (copy-paste EX-42...44)
- https://godbolt.org/z/mdVmeY (copy-paste EX-42..43+45)
- https://godbolt.org/z/gejU3B (copy-paste EX-42..43+46)
- https://godbolt.org/z/cW3Gz8583 (Tracking-Support für Demos)
- https://godbolt.org/z/4EK4a6b3f
- https://godbolt.org/z/8h1cnq9vY
Rule of Four, Rule of Six, Rule of Zero
= Inhalte Basic Refreshments, 3.5 und 6.1 bis 6.4 und
`std::unique_ptr` aus Dynamic Memory Management
- https://godbolt.org/z/hG96vnKT4 <--- Motivation
Management der Speicherplatz-Lebensdauer für `name_`
=> Problem: Zeiger (`char`-Pointer lebt länger als Ziel-Adresse) - https://godbolt.org/z/4f7qesTee <--- Lösung
Zeichen des Strings umkopieren in Heap-Speicher - https://godbolt.org/z/zYrnn7P5d <--- Lösung (1. Variante)
- https://godbolt.org/z/Mq5zof6oM <--- Lösung (2. Variante)
=> Problem: Heap Speicher wird nie freigegeben - https://godbolt.org/z/KMEYY4cWv <--- Lösung
Einführung eines Destruktors
=> Problem: Doppel-Freigabe durch autmatisch generierten "Copy-C'tor" / "Copy-Assign" - https://godbolt.org/z/Kdfh5shY1 <---- Lösung
autromatische Generierung von Copy-C'tor / Copy-Assign unterbinden - => Problem: `NamedCounter`_ nicht mehr durch "Factory-Funktionen" erstellbar
- https://godbolt.org/z/8eafEo8Y5 <---- Lösung (nur Move-C'tor)
- https://godbolt.org/z/qTMf9MarP <---- Lösung (Move-C'tor UND Move-Assignment)
"Copy" bleibt verboten, aber "Move" wird erlaubt
=> Problem: mittleweile "komplexer Code" für eine (relativ) "einfache Aufgabe" - https://godbolt.org/z/sxq9d4cxx <---- Lösung
wird der Zeiger auf Heap-Speicherplatz wird in einem `std::unique_ptr` gehalten, kann ein großer Teil des bishrigen Codes entfallen; es muss lediglich dafür gesorgt werden, dass der `std::unique_ptr` die passende Freigabe vornimmt:- RICHTIG: std::unique_ptr<char[]> name_;
- FALSCH: std::unique_ptr<char>name_;
- https://godbolt.org/z/noW865bY3 <---- Variante mit weiteren Operator-Überladungen
TBD:
- https://godbolt.org/z/3TTETevMf
Beispiel zu `const_cast` - https://godbolt.org/z/9ErEzvdac
Member-Funktionen außerhalb von Klassen bei Template - https://godbolt.org/z/o94vfb415
Templates - https://godbolt.org/z/s4WWMTnoG
(template specialization) - https://godbolt.org/z/Mroo8cvT4
STL Verwendung von Lambdas - https://godbolt.org/z/7ofxbc1rs
Austausch konkreter Container
WeitePastere während der Schulung erwähnte Links
- https://de.wikipedia.org/wiki/Hashfunktion
Erläuterungen zum Prinzip von Hash-Datenstrukturen
(wie in `std::unordered_set` und `std::unordered_map` verwendet) - https://isocpp.org/wiki/faq/proper-inheritance
Richtlinien zum Einsatz von Vererbung basiered auf LSP - http://www.bleading-edge.com/Publications/C++Report/v9603/Article2a.htm
http://www.bleading-edge.com/Publications/C++Report/v9605/Column1.htm
"Best Practices" im Guideline-Stil zum Einsatz von Exceptions
Ursprünglich vorab geplante Agenda
- Montag (∑ = 114)
- Introduction (12 [-3])
- Abschnitt 3 (3 Seiten) wird erst im Kapitel "Idioms und Pitfalls"
behandelt (dort ist es ebenfalls und ausführlicher vorhanden) - Basic Refreshments (119 [-14])
- Abschnitt 3.5 (4 Seiten) und
- Abschnitte 6.1 bis 6.4 (10 Seiten) werden erst am Mittwoch
im Rahmen des Kapitels Memory Management (mit-) behandelt - Abschnitt 5 zusammen mit einer darauf basierenden Übung
- (zusätzlich zu den Übungen im Kapitels 11) am Tagesende
- Dienstag (∑ = 144 [-??])
- Exception Handling (47)
- New Style Casts [incl. RTTI] (28)
- Dynamic Memory Management (55 [+14] [-??])
- Move-Semantik und Smart-Pointer (?? Seiten)
- je nach Gesamtverlauf evtl. auch erst Mittwoch
- Mittwoch (∑ = 106 [+??])
- wenn nicht schon Dienstag behandelt
- jetzt Move-Semantik und Smart-Pointer
- Lambda Functions (nur kurzer Überblick)
- Generic Programming with Templates (nur kurzer Überblick)
- STL Containers, Algorithms, Iterators (106)
- Donnerstag (∑ = 99)
- Multi-Threading and Synchronisation (34)
- Idioms and Pitfalls (29])
- Effectivity and Efficiency with C++ (36)