{"id":4952,"date":"2025-09-01T14:02:33","date_gmt":"2025-09-01T12:02:33","guid":{"rendered":"https:\/\/fliegerhorst.dyndns.org\/?p=4952"},"modified":"2026-03-02T15:34:41","modified_gmt":"2026-03-02T14:34:41","slug":"c","status":"publish","type":"post","link":"https:\/\/fliegerhorst.dyndns.org\/index.php\/2025\/09\/01\/c\/","title":{"rendered":"C++"},"content":{"rendered":"\n<p>Ich habe mir das Buch <strong>&#8222;Eine Tour durch C++&#8220;<\/strong> (2023) von <em>Bjarne Stroustrup<\/em> gekauft und werde hier ein paar Extrakte aus dem Buch als Nachschlagewerk zusammenstellen, um die leicht auffindbar zu haben.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Referenz<\/h3>\n\n\n\n<p>Als gutes Nachschlagewerk hat sich die folgende Internetseite etabliert: <a href=\"https:\/\/cplusplus.com\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">CPLUSPLUS.COM<\/a>. Insbesondere ist hier die Standard Template Library sehr gut beschrieben und wird hier auch immer aktuell gehalten.<\/p>\n\n\n\n<p>Ein gutes Tutorial, bei dem es auch zu jedem Beitrag ein Beispiel gibt, ist <a href=\"https:\/\/www.w3schools.com\/cpp\/\">hier <\/a>zu finden. <a href=\"https:\/\/www.tutorialspoint.com\/cplusplus\/index.htm\">Hier<\/a> ist ein weiteres Tutorial, was von der Machart ziemlich dasselbe ist wie das vorige.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Schl\u00fcsselw\u00f6rter und deren Bedeutung<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Kategorie<\/th><th>Schl\u00fcsselwort<\/th><th>Erl\u00e4uterung<\/th><\/tr><\/thead><tbody><tr><td>Konstanten<\/td><td><code>const<\/code><\/td><td>Konstante, die zur Laufzeit zugewiesen werden kann. Muss nicht bereits zur Compile-Zeit feststehen.<\/td><\/tr><tr><td>Konstanten<\/td><td><code>constexpr<\/code><\/td><td>NEU !! Diese Konstante mu\u00df bereits beim Kompilieren feststehen Sie kann nicht erst zur Laufzeit berechnet werden.<\/td><\/tr><tr><td>Konstanten<\/td><td><code>constexpr<\/code><\/td><td>NEU !! Wenn der return-Wert einer Funktion einer <code>const<\/code>-Konstante zugewiesen werden soll.<br>Beispiel: <code>constexpr u32 Funktionsname(...) {...}<\/code><\/td><\/tr><tr><td>Konstanten<\/td><td><code>consteval<\/code><\/td><td>NEU !! Wenn der return-Wert einer Funktion einer <code>constexpr<\/code> Konstante zugewiesen werden soll, also bereits zur Compile-Zeit feststehen mu\u00df.<br>Beispiel: <code>consteval u32 Funktionsname(...) {...}<\/code><\/td><\/tr><tr><td>Deklaration<\/td><td><code>auto<\/code><\/td><td>NEU !! Automatisiert die Zuweisung des richtigen Variablentypes. <br>Beispiel: <code>auto ObjectInst_o = Object_o;<\/code> Die Variable ObjectInst_o bekommt automatisch den richtigen Typ zugewiesen, n\u00e4mlich den von Object_o.<\/td><\/tr><tr><td>Referenz<\/td><td><code>u32 &amp;a = b<\/code><\/td><td><code>a<\/code> ist nur ein anderer Name von <code>b<\/code>. Es wird keine Kopie von <code>b<\/code> angelegt und <code>a<\/code> zugewiesen, d.h. <code>a<\/code> ist <code>b<\/code>. Es wird auf dieselbe Speicherstelle verwiesen, ohne ein Pointer zu sein.<\/td><\/tr><tr><td><code>for<\/code>-Schleife<\/td><td><code>for(u32 x : v) {...}<\/code><\/td><td>Durchl\u00e4uft eine Schleife &#8218;f\u00fcr alle <code>x<\/code>-Vorkommen in <code>v<\/code>. <code>v<\/code> k\u00f6nnte dann zum Beispiel ein Array sein oder ein Vector oder &#8230;.<\/td><\/tr><tr><td>Nullpointer<\/td><td><code>nullptr<\/code><\/td><td>Weist einem Pointer ein Nullpointer-Wert zu.<br>Beispiel: <code>u32 *ZeigerAufU32_pu32 = nullptr;<\/code><\/td><\/tr><tr><td>Enumeratoren<\/td><td><code>enum <strong>class<\/strong> Color_e { red, blue, green }<\/code><\/td><td>NEU !! Spezieller enumerator Typ, die <code>class<\/code>nach dem <code>enum<\/code>zeigt an, dass eine Aufz\u00e4hlung stark typisiert ist und daher nur mit diesem enemerator Typ benutzt werden kann. <\/td><\/tr><tr><td>Module<\/td><td><code>export module <em>Name<\/em><\/code><\/td><td>NEU !! Mit dem Schl\u00fcsselwort <code>export module<\/code>definiert man ein Modul mit dem entsprechenden Namen dahinter. Alles was nach au\u00dfen hin bekannt sein soll, mu\u00df ebenfalls mit <code>export<\/code>sichtbar gemacht werden. Alles was nicht exportiert wird, ist nachher beim <code>import<\/code>unbekannt.<\/td><\/tr><tr><td>Module<\/td><td><code>import <em>Name<\/em><\/code><\/td><td>NEU !! Hier wird ein Modul importiert und alle im Modul mit <code>export<\/code>bekannt gemachten Definitionen importiert. <br>Beispiel: <code>import std<\/code>importiert die gesamte Standard-Template-Bibliothek als Modul <em>(sollte man immer so machen)<\/em>.<\/td><\/tr><tr><td>Namensr\u00e4ume<\/td><td>namespace <em>Bezeichnung<\/em> { &#8230; }<\/td><td>Deklariert einen neuen Namensbereich <em>Bezeichnung<\/em>. Auf den Namensraum kann mit den Schl\u00fcsselwort <code>using<\/code>zugegriffen werden.<\/td><\/tr><tr><td>Namensr\u00e4ume<\/td><td><code>using <em>Bezeichnung<\/em><\/code><\/td><td>Eine <code>using<\/code>-Deklaration macht einen Namen aus einem Namensraum benutzbar.<br>Beispiel: <code>using Namensraum::Funktion;<\/code>macht die Funktion <em>Funktion<\/em> aus dem Namensraum lokal verf\u00fcgbar.<\/td><\/tr><tr><td>Namensraum<\/td><td><code>using <strong>namespace<\/strong> <em>Bezeichnung<\/em><\/code><\/td><td>Macht alle Namen im Namensraum Bezeichnung verf\u00fcgbar. Man spart sich Schreibarbeit.<br>Beispiel: <code>using namespace std<\/code> macht alle Namen im Standardbibliotheksraum verf\u00fcgbar. Man spart sich dadurch die wiederholten <code>std::<\/code>-Qualifikationen f\u00fcr jedem Namen der Standardbibliothek.<\/td><\/tr><tr><td>Fehlerbehandlung<\/td><td><code><strong>try<\/strong> { <em>code<\/em> } <strong>catch<\/strong> (const err_type &amp;err_t) { <em>Err_handling<\/em> }<\/code><\/td><td>Tritt zur Laufzeit im Code des <code>try<\/code>-Blocks ein Fehler auf, dann wird sofort der <code>catch<\/code>-Block ausgef\u00fchrt. Dem Catch-Block wird eine Referenz mitgegeben, der den Fehlertyp genauer beschreibt. Der Fehlertyp kann dann im Error-Handling ausgegeben werden. Es kann mehrere <code>catch<\/code>-Bl\u00f6cke geben f\u00fcr verschiedene Fehlertypen.<\/td><\/tr><tr><td>Fehlerbehandlung<\/td><td><code><strong>throw<\/strong> <em>err_hndl<\/em>(\"Text\");<\/code><\/td><td><code>throw<\/code> wirft direkt einen Fehler und die entsprechende Fehlerausgabe. <\/td><\/tr><tr><td>Fehlerbehandlung<\/td><td><code>assert(<em>Bedingung<\/em>);<\/code><\/td><td>Wenn die Bedingung eines <code>assert()<\/code> im Debug-Modus scheitert, wird das Programm beendet. Ist man nicht Debug-Modus wird nicht gepr\u00fcft.<\/td><\/tr><tr><td>Fehlerbehandlung<\/td><td><code>static_assert(<em>Bedingung<\/em>, \"Text\");<\/code><\/td><td><code>static_assert()<\/code>findet Fehler bereits beim komilieren.<\/td><\/tr><tr><td>Fehlerbehandlung<\/td><td><code>void Funktion() <strong>noexcept<\/strong> { ... }<\/code><\/td><td><code>noexcept<\/code>kann benutzt werden um vorzugeben, dass eine Funktion niemals eine Exception werfen soll. Sollte doch ein Fehler auftreten, wird stattdessen das Programm beendet.<\/td><\/tr><tr><td>Smart-Pointer<\/td><td><code><strong>unique_ptr<\/strong>&lt;type&gt; PointerName_p;<\/code><\/td><td>&#8230; definiert einen Pointer <em>PointerName_p<\/em> des Typs <em>type<\/em>.<br>Beispiel: <code><strong>unique_ptr<\/strong>&lt;int&gt; IntegerVar_pui;<\/code><\/td><\/tr><tr><td>Konstruktor<\/td><td><code>class  Klasse_c<br>{<br>  Klasse_c(type&amp;) = <strong>default<\/strong>;<br>}<\/code><\/td><td>Explizite Verwendung des Kopierkonstruktors durch Verwendung von <code>default<\/code>. Andere Standardimplementierungen sind dadurch nicht mehr m\u00f6glich (z.B. Move-Konstruktor).<\/td><\/tr><tr><td>Konstruktor<\/td><td><code>class  Klasse_c<br>{<br>  Klasse_c(type&amp;) = <strong>delete<\/strong>;<br>}<\/code><\/td><td>Die Verwendung von <code>delete<\/code>verbietet die Verwendung eines bestimmten Konstruktors. Im Beispiel links ist die Verwendung des Kopierkonstruktors nicht mehr m\u00f6glich.<\/td><\/tr><tr><td>Konstruktor<\/td><td><code>class  Klasse_c<br>{<br>  <strong>explicit<\/strong> Klasse_c(int s);<br>}<\/code><\/td><td>Die Verwendung von <code>explicit<\/code> erlaubt ausschlie\u00dflich nur die Verwendung dieses Konstruktors. Andere Konstruktoren werden nicht mehr <em>implizit<\/em> verwendet.<\/td><\/tr><tr><td>Template<\/td><td><code>template&lt;<strong>typename<\/strong> T&gt;<br>class Klasse_c { ... }<\/code><\/td><td>Unbeschr\u00e4nktes Typargument: <br><code><strong>typename<\/strong><\/code> &#8211;&gt; <em>&#8222;F\u00fcr alle Typen T&#8230;&#8220;<\/em><\/td><\/tr><tr><td>Template<\/td><td><code>template&lt;<strong>Element<\/strong> T&gt;<br>class Klasse_c { ... }<\/code><\/td><td>Beschr\u00e4nktes Typargument: (Konzept)<br><code><strong>Element<\/strong><\/code> &#8211;&gt; <em>&#8222;F\u00fcr alle Typen T, sodass Element(T)&#8230;&#8220;<\/em><\/td><\/tr><tr><td>Template<\/td><td><code>template&lt;typename<strong>...<\/strong> T&gt; class Klasse_c {  }; <\/code><\/td><td>Templates mit variabler Anzahl von Template-Parametern. Diese werden \u2013 wie bei Funktionen und Makros mit variabler Parameteranzahl \u2013 mit <code>...<\/code> gekennzeichnet<br>Verwendung:<br><code>Klasse_c&lt;int, int, char, std::vector&lt;int&gt;, double&gt; t;<\/code><\/td><\/tr><tr><td>Template<\/td><td><code>template&lt;typename T, <strong>int N<\/strong>&gt; struct buffer { T elem [N]; };<\/code><\/td><td>Nicht-Typ-Templateparameter<br>Verwendung:<br><code>Buffer&lt;char, 1024&gt; globBuf_o;<\/code><\/td><\/tr><tr><td>Template<\/td><td><code>template&lt;typename T, typename N&gt;<br>N foo(const T &amp;s, N n) { }<\/code><\/td><td>Funktionstemplate<\/td><\/tr><tr><td>Template<\/td><td><code>template&lt;typename T&gt;<\/code><br><code>class LessThan { const T val;<\/code><br><code>public :<\/code><br><code>LessThan(const T &amp;v) : val(v) {}<\/code><br><code>bool operator()(const \/ &amp;x) const { return x&lt;val} } };<\/code><\/td><td>Funktionsobjekt &#8211; Die Funktion operator(), implementiert den Anwendungsoperator <code>()<\/code>. <br>Verwendung:<br><code>LessThan KleinerGleich42(42);<br>bool b = KleinerGleich42(38)<\/code><br><br>Ergebnis: b ist &#8218;TRUE&#8216;, da &#8218;8&#8216; kleiner &#8217;42&#8216;.<\/td><\/tr><tr><td>Lambda Ausdruck<\/td><td><code>[capture](parameter) -&gt; return_type { body }<\/code><\/td><td><strong>Lambda<\/strong> : <strong>anonyme Funktion<\/strong> (= Funktion ohne Namen), direkt im Code definiert und ggf. Variablen aus dem umgebenden Scope \u201emitnimmt\u201c.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Schl\u00fcsselw\u00f6rter f\u00fcr Vererbung und Polymorphie<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Schl\u00fcsselwort \/ Konstruktion<\/th><th>Verwendung<\/th><th>Bedeutung \/ Zweck<\/th><th>Beispiel<\/th><\/tr><\/thead><tbody><tr><td><code>virtual<\/code><\/td><td>in der <strong>Basisklasse<\/strong><\/td><td>Markiert eine Methode als <strong>virtuell<\/strong>, d. h. sie kann von abgeleiteten Klassen <strong>\u00fcberschrieben<\/strong> werden (erm\u00f6glicht <em>dynamic dispatch<\/em>).<\/td><td><code>virtual void speak();<\/code><\/td><\/tr><tr><td><code>override<\/code><\/td><td>in der <strong>abgeleiteten Klasse<\/strong><\/td><td>Markiert eine Methode, die <strong>eine virtuelle Methode aus der Basisklasse \u00fcberschreibt<\/strong>. Der Compiler pr\u00fcft, dass tats\u00e4chlich eine passende <code>virtual<\/code>-Methode existiert.<\/td><td><code>void speak() override;<\/code><\/td><\/tr><tr><td><code>final<\/code><\/td><td>in der <strong>abgeleiteten Klasse<\/strong> oder bei einer <strong>Methode<\/strong><\/td><td>\u2460 Bei Klassen: verhindert weitere Vererbung.<br>\u2461 Bei Methoden: verhindert weitere \u00dcberschreibungen.<\/td><td><code>class Derived final : public Base {};<\/code><br><code>void speak() final override;<\/code><\/td><\/tr><tr><td><code>= 0<\/code><\/td><td>in der <strong>Basisklasse<\/strong><\/td><td>Macht eine virtuelle Methode <strong>abstrakt<\/strong> \u2192 die Klasse wird zur <strong>reinen Schnittstelle (abstract base class)<\/strong>.<\/td><td><code>virtual void draw() = 0;<\/code><\/td><\/tr><tr><td><code>virtual \u2026 = 0;<\/code><\/td><td>in der <strong>Basisklasse<\/strong><\/td><td>Kombiniert beide Effekte: virtuelle + abstrakte Funktion \u2192 muss in abgeleiteten Klassen implementiert werden.<\/td><td><code>virtual void update() = 0;<\/code><\/td><\/tr><tr><td><code>Base::method()<\/code><\/td><td>in der <strong>abgeleiteten Klasse<\/strong><\/td><td>Ruft die <strong>Implementierung aus der Basisklasse<\/strong> auf (z. B. in \u00fcberschriebenen Methoden).<\/td><td><code>Base::speak();<\/code><\/td><\/tr><tr><td><code>using Base::method;<\/code><\/td><td>in der <strong>abgeleiteten Klasse<\/strong><\/td><td>Macht \u00fcberladene Methoden der Basisklasse sichtbar (verhindert \u00dcberdeckung durch Namensverdeckung).<\/td><td><code>using Base::draw;<\/code><\/td><\/tr><tr><td><code>dynamic_cast&lt;&gt;()<\/code><\/td><td>Laufzeit (RTTI)<\/td><td>Erm\u00f6glicht <strong>sichere Typumwandlung<\/strong> innerhalb einer Vererbungshierarchie; pr\u00fcft zur Laufzeit, ob der Cast g\u00fcltig ist.<\/td><td><code>Derived* d = dynamic_cast&lt;Derived*&gt;(basePtr);<\/code><\/td><\/tr><tr><td><code>typeid<\/code><\/td><td>Laufzeit (RTTI)<\/td><td>Gibt den <strong>tats\u00e4chlichen Typ<\/strong> eines Objekts zur Laufzeit zur\u00fcck (n\u00fctzlich bei polymorphen Basisklassen).<\/td><td><code>typeid(*ptr).name();<\/code><\/td><\/tr><tr><td><code>virtual ~Base()<\/code><\/td><td>in der <strong>Basisklasse<\/strong><\/td><td>Virtueller Destruktor \u2192 sorgt daf\u00fcr, dass beim L\u00f6schen \u00fcber einen Zeiger auf die Basisklasse <strong>auch der abgeleitete Destruktor<\/strong> aufgerufen wird.<\/td><td><code>virtual ~Base() = default;<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Die Standard Template Library (STL)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Container<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"604\" height=\"593\" src=\"https:\/\/fliegerhorst.dyndns.org\/wp-content\/uploads\/2025\/09\/STL_Decision_Tree-2.png\" alt=\"\" class=\"wp-image-5014\" srcset=\"https:\/\/fliegerhorst.dyndns.org\/wp-content\/uploads\/2025\/09\/STL_Decision_Tree-2.png 604w, https:\/\/fliegerhorst.dyndns.org\/wp-content\/uploads\/2025\/09\/STL_Decision_Tree-2-300x295.png 300w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Beziehungen zwischen Klassen in C++<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Beziehung<\/th><th>Bedeutung<\/th><th>Lebensdauer-Abh\u00e4ngigkeit<\/th><th>Codebeispiel<\/th><th>\ud83d\udcd0 ASCII-UML<\/th><th>\ud83c\udfaf Wann sinnvoll?<\/th><th>\u26a0\ufe0f Typische Fehler<\/th><\/tr><\/thead><tbody><tr><td><strong>Vererbung<\/strong><\/td><td>\u201eist-ein\u201c-Beziehung<\/td><td>Abgeleitete Klasse ist Basisklasse<\/td><td><code>class B : public A {};<\/code><\/td><td><code>B \u2500\u2500\u2500\u25b7 A<\/code><\/td><td>Wenn echte Spezialisierung vorliegt<\/td><td>Vererbung nur zur Wiederverwendung von Code benutzen<\/td><\/tr><tr><td><strong>Komposition<\/strong><\/td><td>Starkes \u201ebesteht aus\u201c<\/td><td>Teil lebt und stirbt mit Ganzem<\/td><td><code>Engine engine;<\/code><\/td><td><code>Car \u25c6\u2500\u2500 Engine<\/code><\/td><td>Wenn Objekt integraler Bestandteil ist<\/td><td>Zu starke Kopplung erzeugen<\/td><\/tr><tr><td><strong>Aggregation<\/strong><\/td><td>Schwaches \u201ehat ein\u201c<\/td><td>Teil existiert unabh\u00e4ngig<\/td><td><code>Engine* engine;<\/code><\/td><td><code>Car \u25c7\u2500\u2500 Engine<\/code><\/td><td>Wenn Besitz nicht eindeutig ist<\/td><td>Unklare Besitzverh\u00e4ltnisse<\/td><\/tr><tr><td><strong>Assoziation<\/strong><\/td><td>Benutzt-Beziehung<\/td><td>Keine Besitzbindung<\/td><td><code>void drive(Engine&amp; e);<\/code><\/td><td><code>Car \u2500\u2500\u2500 Engine<\/code><\/td><td>Wenn nur Zusammenarbeit n\u00f6tig<\/td><td>Verwechslung mit Aggregation<\/td><\/tr><tr><td><strong>Abh\u00e4ngigkeit<\/strong><\/td><td>Kurzzeitige Nutzung<\/td><td>Nur tempor\u00e4r<\/td><td><code>void foo(Engine e);<\/code><\/td><td><code>Car ---> Engine<\/code><\/td><td>Parameter, lokale Nutzung<\/td><td>Zu viele unn\u00f6tige Includes<\/td><\/tr><tr><td><strong>Realisierung (Interface)<\/strong><\/td><td>Implementiert Vertrag<\/td><td>Wie Vererbung<\/td><td><code>class B : public I {};<\/code><\/td><td><code>B --\u25b7 I<\/code><\/td><td>Polymorphie, Austauschbarkeit<\/td><td>Interface mit Implementierung vermischen<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe mir das Buch &#8222;Eine Tour durch C++&#8220; (2023) von Bjarne Stroustrup gekauft und werde hier ein paar Extrakte aus dem Buch als Nachschlagewerk zusammenstellen, um die leicht auffindbar zu haben. Referenz Als gutes Nachschlagewerk hat sich die folgende Internetseite etabliert: CPLUSPLUS.COM. Insbesondere ist hier die Standard Template Library sehr gut beschrieben und wird[&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4998,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"zakra_general_container_width":0,"zakra_general_content_width":0,"zakra_general_sidebar_width":0,"zakra_sticky_header":"customizer","zakra_header_main_area":true,"zakra_site_logo_width":0,"zakra_header_top_enabled":"customizer","zakra_header_top_style":"customizer","zakra_primary_menu_item_style":"customizer","zakra_page_header_text_color":"","zakra_page_header_layout":"customizer","zakra_page_title_bg":"","zakra_footer_widgets_bg_image":0,"zakra_page_title_bg_repeat":"customizer","zakra_page_title_bg_position":"customizer","zakra_page_title_bg_size":"customizer","zakra_page_title_bg_attachment":"customizer","zakra_breadcrumbs_enabled":"customizer","zakra_breadcrumbs_text_color":"","zakra_breadcrumbs_separator_color":"","zakra_breadcrumbs_link_color":"","zakra_breadcrumbs_link_hover_color":"","zakra_page_title_bg_image":0,"zakra_footer_widgets_enabled":"customizer","zakra_footer_column_layout_1_style":"customizer","zakra_footer_widgets_bg":"","zakra_footer_widgets_bg_repeat":"customizer","zakra_footer_widgets_bg_position":"customizer","zakra_footer_widgets_bg_size":"customizer","zakra_footer_widgets_bg_attachment":"customizer","zakra_footer_bar_enabled":"customizer","zakra_footer_bar_style":"customizer","zakra_page_container_layout":"customizer","zakra_page_sidebar_layout":"customizer","zakra_remove_content_margin":false,"zakra_sidebar":"customizer","zakra_transparent_header":"customizer","zakra_logo":0,"zakra_main_header_style":"default","zakra_menu_item_color":"","zakra_menu_item_hover_color":"","zakra_menu_item_active_color":"","zakra_menu_active_style":"","zakra_page_header":true,"ngg_post_thumbnail":0,"footnotes":""},"categories":[37],"tags":[],"class_list":["post-4952","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programmierung"],"_links":{"self":[{"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/posts\/4952","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/comments?post=4952"}],"version-history":[{"count":2,"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/posts\/4952\/revisions"}],"predecessor-version":[{"id":5181,"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/posts\/4952\/revisions\/5181"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/media\/4998"}],"wp:attachment":[{"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/media?parent=4952"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/categories?post=4952"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fliegerhorst.dyndns.org\/index.php\/wp-json\/wp\/v2\/tags?post=4952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}