C++ für Embedded C Programmierer (30.3.2020 - 3.4.2020 Baden Württemberg)
=========================================================================
.. toctree::
:hidden:
setup
install-googletest
vs-code
code/exercise-string/index
.. sidebar:: *Kursinformation*
.. contents::
:local:
**Beginn**
Montag 30.3.2020, 8:00
**Vorbereitung, Übungen**
* Bitte einen `Github `__ Account mitbringen,
um an Übungen teilzunehmen. Diese werden in einem Private
Repository stattfinden (Link folgt).
* :doc:`Hier die Bauanleitung `; bitte wenn geht vorab
ausprobieren (:doc:`Feedback ` sehr
willkommen).
**Schulungsbeschreibungen**
* :doc:`C Einführung `
* :doc:`C Advanced `
* :doc:`C++ `
* :doc:`CMake `
**Folien**
* :download:`C ` (PDF)
* :download:`C++03 ` (PDF)
* :download:`C++11 ` (PDF)
* :download:`CMake ` (PDF)
* :download:`Unittesting
`
(PDF)
**Screenplays**
* :doc:`/trainings/material/soup/unittest/unittest_gtest_basics/screenplay`
* :doc:`/trainings/material/soup/unittest/unittest_gtest_cmake/screenplay`
* :doc:`/trainings/material/soup/unittest/unittest_gtest_fixture/screenplay`
* :doc:`/trainings/material/soup/cxx/cxx_dynamic_memory/screenplay`
* :doc:`/trainings/material/soup/cxx/cxx_ownership_raii/screenplay`
* :doc:`/trainings/material/soup/cxx/cxx_global_initialization/screenplay`
* :doc:`/trainings/material/soup/cxx/cxx_stl_container_intro/screenplay`
**Links**
* C++ Online Reference: `hier `__ oder
`hier `__
* `Scott Meyers: Effective Modern C++
`__
* `Git Book `__
`__.
* `Googletest `__, `Primer
`__
**Sonstiges**
* :doc:`setup`
* :doc:`install-googletest`
* :doc:`vs-code`
* :doc:`/blog/2020/03/ms-teams-on-linux`
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 :doc:`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
``/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 :doc:`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-Übergabe
* ``const`` Methoden
* Langsames 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()`` und ``capacity()``. Siehe
``code/dynmem-ownership/string-demo.cc``
Tag 3
.....
* Diskussion: "Temporary Objects"
(``code/class-basics/temporaries-demo.cc``)
* Copy Konstruktor, Assignment operator
* :doc:`code/exercise-string/index`
* *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 mit ``inline``?
* Pointer-Datentypen (Unittest: ``code/smart-pointers/ownership.cc``).
``std::shared_ptr<>`` (Shared Ownership) und ``std::unique_ptr<>``
(Exclusive Ownership), demonstriert anhand einer
Manager/Employee/Testcase Beziehung.
* Vorgriff auf STL (Code: ``code/smart-pointers/lt-sort.cc``):
sortieren von ``EmployeeRecord``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:
:download:`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: :download:`C++11
(PDF) `, 6ff)
* ``auto``
* `Range based
`__
``for``
* ``lambda``. Siehe
* ``code/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.