C++ für Embedded C Programmierer (30.3.2020 - 3.4.2020 Baden Württemberg)¶
Kursaufbau¶
Test Driven Development bzw. Unittesting ist Teil der Kursanforderung, ergänzend zu den C++-Themen.
Lasst uns also den Kursverlauf testgetrieben entwickeln dort, wo es Sinn macht.
Die meisten der Livehacking Demos können als Testcases gestaltet werden.
Übungen erst recht; der Trainer formuliert die Aufgabe als Unittest - die Teilnehmer hacken - alle diskutieren - nächste Iteration …
Kursverlauf¶
Im folgenden eine Niederschrift des Geschehenen. Übungen und Live-Hacking-Demos des Trainers sind im zur Seite gehörenden Git-Repository (bzw. eines Clones in einem privaten Github-Respository) entwickelt worden.
Die Code-Integration mit HTML verläuft noch nicht ideal, sodass man
den Code hier nicht ansehen kann. Bitte dazu das Repo clonen. Wann immer im folgenden Code erwähnt wird, ist dieser im
zugehörigen Clone in dem Subdirectory zu finden, das der URL im
URL-Bar entspricht. Hier also
<clone-root>/trainings/log/detail/2020-03-30/code/
.
Tag 1¶
Ein nicht unbeträchtlicher Teil des Tages wurde dafür verwendet, um das Google Test Framework auf Ubuntu 16.04 LTS (mit GCC5 als System-Compiler) zum Laufen zu bekommen. Daraus entstanden ist eine Installationsanleitung.
Code:
code/gtest-basics/
. Live-Hacking, GTest und Test Driven Development. Anfangs ohne CMake mit direkter Toolchain-Benutzung, dann Migration auf CMake.Zuerst drei separate Test-Executables:
code/gtest-basics/fail.cc
,code/gtest-basics/non-fatal.cc
,code/gtest-basics/simple.cc
.Dann eine Aggregation durch den Linker (bitte
code/gtest-basics/CMakeLists.txt
ansehen) aller Testcases in ein einzelnes Executable.
Tag 2¶
Klassen (Einführung): Konstruktoren, Methoden, Referenzen,
const
Code:
code/class-basics/
. “Point” Klasse (Live-Hacking)Zuerst in C als
struct
C++ Äquivalent als
class
const
bei Parameter-Übergabeconst
MethodenLangsames Ausbauen: Operator Overloading
Dynamisches Memory,
code/dynmem-ownership/
code/dynmem-ownership/dynmem-tests.cc
. Eine Reihe von Tests, um zu demonstrieren, wie in C und in C++ dynamisch alloziert wird.malloc()
/free()
vs.new
/delete
vs.new[]
/delete[]
Ownership, bzw. RAII (Resource Acquisition is Initialization).
Verwenden von Konstruktor und Destruktor, um Memory-Fehler zu vermeiden. Siehe dazu
code/dynmem-ownership/ownership-ctor-dtor.cc
Benutzung von
valgrind
Ausflug:
std::string
,size()
undcapacity()
. Siehecode/dynmem-ownership/string-demo.cc
Tag 3¶
Diskussion: “Temporary Objects” (
code/class-basics/temporaries-demo.cc
)Copy Konstruktor, Assignment operator
Übung: handgestrickter String, um die Fallen von C++ lustvoll zu erleiden
Copy Constructor und Assignment Operator
Zum Teufel: Self Assignment
Code:
code/exercise-string/
Viel Diskussion
Tag 4¶
Diskussion (Code:
code/static-vs-inline/
):static
(File-Scope), und was hat das zu tun mitinline
?Pointer-Datentypen (Unittest:
code/smart-pointers/ownership.cc
).std::shared_ptr<>
(Shared Ownership) undstd::unique_ptr<>
(Exclusive Ownership), demonstriert anhand einer Manager/Employee/Testcase Beziehung.Vorgriff auf STL (Code:
code/smart-pointers/lt-sort.cc
): sortieren vonEmployeeRecord``s in einem ``std::vector
nach verschiedenen Kriterien.Templates Intro (Code:
class-template/
):class Point
mit parametrisierbarem Koordinatentyp
Tag 5¶
STL Containers (Code:
code/stl-container/
, Slides:C++03 (PDF)
, 102ff)Überblick, Arten von Containern
Pointerarithmetik Wiederholung
Iteratoren, Iteration mit
for
Demos
std::vector
(code/vector.cc
).std::list
(code/list.cc
)std::map
(code/map.cc
)
Diskussion: Laufzeitverhalten, O-Notation
C++11 Verbesserungen gegenüber C++03 (Slides:
C++11 (PDF)
, 6ff)auto
Range based
for
lambda
. Siehecode/stl-container/sort-is-n-log-n.cc
. Gegenüberstellung explizite Funktion vs. Lambda.code/stl-container/vector.cc
:TEST(Vector, Sort_Algorithm_Reverse_Lambda)
code/stl-container/threads.cc
Vererbung vs. Templates. Fallstudie, livegehackt. Wir haben einen Sensor
Thermometer
, der über SPI angebunden ist, und auf den komplexe Stücke Software aufbauen. Nun will ein Kunde, dass wir einen vergleichbaren über I2C anbinden. Zwei Möglichkeiten, und Diskussion,Vererbung (Code:
code/inheritance-interfaces-virtual/
)Templates (Code:
code/inheritance-morph-to-templates/
)
Exceptions wurden nicht explizit als eigenes Kapitel behandelt und quasi im Vorbeigehen erklärt.