diff --git a/CPlusPlus/.gitignore b/CPlusPlus/.gitignore
new file mode 100644
index 0000000..f3b4ba7
--- /dev/null
+++ b/CPlusPlus/.gitignore
@@ -0,0 +1,421 @@
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.tlog
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Nuget personal access tokens and Credentials
+nuget.config
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
+
+# VS Code files for those working on multiple tools
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+*.code-workspace
+
+# Local History for Visual Studio Code
+.history/
+
+# Windows Installer files from build outputs
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# JetBrains Rider
+.idea/
+*.sln.iml
\ No newline at end of file
diff --git a/CPlusPlus/Classes/.idea/.gitignore b/CPlusPlus/Classes/.idea/.gitignore
new file mode 100644
index 0000000..30cf57e
--- /dev/null
+++ b/CPlusPlus/Classes/.idea/.gitignore
@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Ignored default folder with query files
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/CPlusPlus/Classes/.idea/encodings.xml b/CPlusPlus/Classes/.idea/encodings.xml
new file mode 100644
index 0000000..df87cf9
--- /dev/null
+++ b/CPlusPlus/Classes/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CPlusPlus/Classes/AttackType.h b/CPlusPlus/Classes/AttackType.h
new file mode 100644
index 0000000..d7f8a2d
--- /dev/null
+++ b/CPlusPlus/Classes/AttackType.h
@@ -0,0 +1,13 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#ifndef CLASSES_ATTACKTYPE_H
+#define CLASSES_ATTACKTYPE_H
+
+enum AttackType {
+ Melee,
+ Ranged
+};
+
+#endif //CLASSES_ATTACKTYPE_H
diff --git a/CPlusPlus/Classes/CMakeLists.txt b/CPlusPlus/Classes/CMakeLists.txt
new file mode 100644
index 0000000..601eca8
--- /dev/null
+++ b/CPlusPlus/Classes/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 4.3)
+project(Classes)
+
+set(CMAKE_CXX_STANDARD 20)
+
+add_executable(Classes main.cpp
+ Entity.cpp
+ Entity.h
+ Monster.cpp
+ Monster.h
+ Ork.cpp
+ Ork.h
+ Vector3.h
+ AttackType.h
+ IComparable.h
+ Weapon.h
+)
diff --git a/CPlusPlus/Classes/Entity.cpp b/CPlusPlus/Classes/Entity.cpp
new file mode 100644
index 0000000..3f5ddee
--- /dev/null
+++ b/CPlusPlus/Classes/Entity.cpp
@@ -0,0 +1,36 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#include "Entity.h"
+
+#include
+
+using namespace std;
+
+Entity::Entity() : _name("") //defined
+{
+ cout << "Entity constructor called" << endl;
+}
+
+Entity::Entity(string name) : _name(name)
+{
+ // _name = name;
+
+ cout << "Entity constructor with name called" << endl;
+}
+
+Entity::~Entity()
+{
+ cout << "Entity destructor called" << endl;
+}
+
+string Entity::toString()
+{
+ return "Entity: " + _name;
+}
+
+void Entity::setName(string name)
+{
+ _name = name;
+}
diff --git a/CPlusPlus/Classes/Entity.h b/CPlusPlus/Classes/Entity.h
new file mode 100644
index 0000000..ae36c95
--- /dev/null
+++ b/CPlusPlus/Classes/Entity.h
@@ -0,0 +1,29 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#ifndef CLASSES_ENTITY_H
+#define CLASSES_ENTITY_H
+
+#include
+
+using namespace std;
+
+class Entity
+{
+public:
+ Entity(); // declared
+ Entity(string name); // declared
+ virtual ~Entity();
+
+ virtual string toString();
+ void setName(string name);
+
+protected:
+ string _name = "";
+
+private:
+}; // IMPORTANT: don't forget the semicolon
+
+
+#endif //CLASSES_ENTITY_H
diff --git a/CPlusPlus/Classes/IComparable.h b/CPlusPlus/Classes/IComparable.h
new file mode 100644
index 0000000..fb2924a
--- /dev/null
+++ b/CPlusPlus/Classes/IComparable.h
@@ -0,0 +1,22 @@
+//
+// Created by David Hackbarth on 22.09.26.
+//
+
+#ifndef CLASSES_ICOMPARABLE_H
+#define CLASSES_ICOMPARABLE_H
+
+#include
+
+using namespace std;
+
+class IComparable
+{
+public:
+ // only for demonstration purposes
+ IComparable() { cout << "IComparable constructor called" << endl; }
+ virtual ~IComparable() { cout << "IComparable destructor called" << endl; }
+
+ virtual int compareTo(const IComparable& other) const = 0;
+};
+
+#endif //CLASSES_ICOMPARABLE_H
diff --git a/CPlusPlus/Classes/Monster.cpp b/CPlusPlus/Classes/Monster.cpp
new file mode 100644
index 0000000..0979531
--- /dev/null
+++ b/CPlusPlus/Classes/Monster.cpp
@@ -0,0 +1,50 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#include "Monster.h"
+
+#include
+
+using namespace std;
+
+Monster::Monster() : Entity(""), _pWeapon(new Weapon())
+{
+ cout << "Monster constructor called" << endl;
+}
+
+Monster::Monster(string name) : Entity(name), _pWeapon(new Weapon())
+{
+ cout << "Monster constructor with name called" << endl;
+}
+
+Monster::Monster(const Monster& other)
+{
+ // shallow copy
+ this->_name = other._name;
+ // this->_pWeapon = other._pWeapon;
+
+ // deep copy
+ this->_pWeapon = new Weapon(*other._pWeapon);
+}
+
+Monster::~Monster()
+{
+ cout << "Monster destructor called" << endl;
+
+ if (_pWeapon != nullptr)
+ {
+ delete _pWeapon;
+ _pWeapon = nullptr;
+ }
+}
+
+string Monster::toString()
+{
+ return "Monster: " + _name;
+}
+
+int Monster::compareTo(const IComparable& other) const
+{
+ return 0;
+}
diff --git a/CPlusPlus/Classes/Monster.h b/CPlusPlus/Classes/Monster.h
new file mode 100644
index 0000000..cf113e2
--- /dev/null
+++ b/CPlusPlus/Classes/Monster.h
@@ -0,0 +1,33 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#ifndef CLASSES_MONSTER_H
+#define CLASSES_MONSTER_H
+
+#include "Entity.h"
+#include "IComparable.h"
+#include "Weapon.h"
+
+
+class Monster : public Entity, public IComparable
+{
+public:
+ // default constructor, copy constructor & destructor, if you need one you'll need all of them
+ // internal pointers often requires a deep copy and so a default constructor & a copy constructor & a destructor
+ Monster();
+ Monster(string name);
+ Monster(const Monster& other);
+ ~Monster() override;
+
+ string toString() override;
+ int compareTo(const IComparable& other) const override;
+
+ // void assignWeapon(Weapon* weapon);
+
+protected:
+ Weapon* _pWeapon = nullptr;
+};
+
+
+#endif //CLASSES_MONSTER_H
diff --git a/CPlusPlus/Classes/Ork.cpp b/CPlusPlus/Classes/Ork.cpp
new file mode 100644
index 0000000..495d648
--- /dev/null
+++ b/CPlusPlus/Classes/Ork.cpp
@@ -0,0 +1,29 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#include "Ork.h"
+
+#include
+
+using namespace std;
+
+Ork::Ork(string name) : Monster(name)
+{
+ cout << "Ork constructor with name called" << endl;
+}
+
+Ork::~Ork()
+{
+ cout << "Ork destructor called" << endl;
+}
+
+string Ork::toString()
+{
+ return "Ork: " + _name;
+}
+
+void Ork::testMethod()
+{
+ cout << "testMethod called" << endl;
+}
diff --git a/CPlusPlus/Classes/Ork.h b/CPlusPlus/Classes/Ork.h
new file mode 100644
index 0000000..891ab8d
--- /dev/null
+++ b/CPlusPlus/Classes/Ork.h
@@ -0,0 +1,22 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#ifndef CLASSES_ORK_H
+#define CLASSES_ORK_H
+
+#include "Monster.h"
+
+
+class Ork : public Monster
+{
+public:
+ Ork(string name);
+ ~Ork() override;
+
+ string toString() override;
+ virtual void testMethod();
+};
+
+
+#endif //CLASSES_ORK_H
diff --git a/CPlusPlus/Classes/Vector3.h b/CPlusPlus/Classes/Vector3.h
new file mode 100644
index 0000000..4e2a5f2
--- /dev/null
+++ b/CPlusPlus/Classes/Vector3.h
@@ -0,0 +1,18 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#ifndef CLASSES_VECTOR3_H
+#define CLASSES_VECTOR3_H
+
+struct Vector3
+{
+ float x;
+ float y;
+ float z;
+
+ Vector3() : x(0.0f), y(0.0f), z(0.0f) {}
+ Vector3(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {}
+};
+
+#endif //CLASSES_VECTOR3_H
diff --git a/CPlusPlus/Classes/Weapon.h b/CPlusPlus/Classes/Weapon.h
new file mode 100644
index 0000000..131e1a7
--- /dev/null
+++ b/CPlusPlus/Classes/Weapon.h
@@ -0,0 +1,27 @@
+//
+// Created by David Hackbarth on 23.09.26.
+//
+
+#ifndef CLASSES_WEAPON_H
+#define CLASSES_WEAPON_H
+
+class Weapon {
+public:
+ // implicit inlining
+ const int& getAmmo() const { return _ammo; }
+ void setAmmo(int ammo) { _ammo = ammo; }
+
+ // explicit inlining
+ const int& getDamage() const;
+ void setDamage(int damage);
+
+private:
+ int _ammo = 0;
+ int _damage = 0;
+};
+
+// explicit inlining needs the method definition to be always in the header file
+inline const int& Weapon::getDamage() const { return _damage; }
+inline void Weapon::setDamage(int damage) { _damage = damage; }
+
+#endif //CLASSES_WEAPON_H
diff --git a/CPlusPlus/Classes/main.cpp b/CPlusPlus/Classes/main.cpp
new file mode 100644
index 0000000..cb9de9e
--- /dev/null
+++ b/CPlusPlus/Classes/main.cpp
@@ -0,0 +1,151 @@
+#include
+
+#include "AttackType.h"
+#include "Entity.h"
+#include "Monster.h"
+#include "Ork.h"
+#include "Vector3.h"
+#include "Weapon.h"
+
+using namespace std;
+
+int main()
+{
+ Entity e("John"); // this is an entity instance
+ cout << e.toString() << endl;
+ e.setName("Fred");
+
+ Monster m("Doe");
+ cout << m.toString() << endl;
+ m.setName("Jane");
+
+ Ork o("Alex");
+
+ Monster m2 = m; // m2 is a copy of m
+
+ Vector3 v;
+ v.x = 1.0f;
+ v.y = 2.0f;
+ v.z = 3.0f;
+
+ Vector3 v2(1.0f, 2.0f, 3.0f);
+ Vector3 v3 = Vector3(1.0f, 2.0f, 3.0f);
+ Vector3 v4 = {1.0f, 2.0f, 3.0f}; // list-initialization assigned
+ Vector3 v5 { 1.0f, 2.0f, 3.0f }; // list-initialization
+
+ Weapon w;
+ w.setAmmo(100);
+ // int ammo = w.getAmmo();
+ cout << w.getAmmo() << endl;
+ w.setDamage(9999);
+ int damage = w.getDamage();
+
+ Weapon* pWeapon = new Weapon();
+ pWeapon->setAmmo(100);
+ int ammo2 = pWeapon->getAmmo();
+
+ AttackType at = Melee;
+ at = AttackType::Ranged;
+
+ // interfaces & abstract classes
+ IComparable* pComparable = nullptr;
+ pComparable = &m;
+ pComparable = &o;
+ pComparable->compareTo(o);
+ (*pComparable).compareTo(o); // same as pComparable->compareTo(o)
+
+ IComparable* comparables[] = { new Ork("Ork 1"), new Ork("Ork 2"), new Monster };
+ for (int i = 0; i < size(comparables); ++i)
+ {
+ comparables[i]->compareTo(o);
+ delete comparables[i];
+ comparables[i] = nullptr;
+ }
+
+ // create a heap pointer array
+ IComparable** heapComparables = new IComparable*[3];
+ heapComparables[0] = new Ork("Ork 1");
+ heapComparables[1] = new Ork("Ork 2");
+ heapComparables[2] = new Monster;
+
+ for (size_t i = 0; i < 3; ++i)
+ {
+ // delete the elements first
+ delete heapComparables[i];
+ heapComparables[i] = nullptr;
+ }
+ delete[] heapComparables;
+ heapComparables = nullptr;
+
+ // casts
+ // c cast
+ int number = -100000000;
+ unsigned short smallPositiveNumber = (unsigned short)number;
+ int *pNumber = &number;
+ unsigned short* pSmallPositiveNumber = (unsigned short*)pNumber;
+ float fNumber = (float)number;
+ float* pFNumber = (float*)pNumber;
+ int* pNumbers = new int[3];
+ void** pVoidNumbers = (void**)&pNumbers;
+ Monster* pMonster = (Monster*)pNumbers;
+ Monster* pMonster2 = new Ork("Bla bla");
+ Ork* pOrk = (Ork*)pMonster2;
+ string toString = pOrk->toString();
+ pOrk->testMethod();
+ Monster* pMonster3 = new Monster();
+ Ork* pOrk2 = (Ork*)pMonster3;
+ string toString2 = pOrk2->toString();
+
+ // runtime error, because pMonster3 is a Monster, not an Ork,
+ // virtual table lookup is in the Monster and not the Ork class
+ // pOrk2->testMethod();
+
+ // c++ cast
+ // static_cast
+ smallPositiveNumber = static_cast(number);
+
+ // compiler error, use reinterpret_cast with caution instead
+ // pSmallPositiveNumber = static_cast(pNumber);
+
+ fNumber = static_cast(number);
+ // pFNumber = static_cast(pNumber);
+ // pVoidNumbers = static_cast(pNumbers);
+ pOrk = static_cast(pMonster2); // possible, but dynamic_cast is better
+ // Weapon* pWeapon = static_cast(pMonster2); // compiler error, because Monster and Weapon are unrelated
+ // pOrk2 = static_cast(pMonster3); // possible, but dynamic_cast is better and this example will not work at all
+
+ // dynamic_cast, do runtime checks, same as 'as' in C#
+ pOrk = dynamic_cast(pMonster2);
+ pOrk2 = dynamic_cast(pMonster3);
+
+ // reinterpret_cast
+ // smallPositiveNumber = reinterpret_cast(number); // compiler error, use static_cast instead
+ pSmallPositiveNumber = reinterpret_cast(pNumber);
+ pFNumber = reinterpret_cast(pNumber);
+
+ // const_cast
+ const char* sz = "Test";
+ // sz[0] = 'H'; // compiler error, use const_cast instead
+ // char* nonConstSz = sz;
+ char* nonConstSz = const_cast(sz);
+ nonConstSz[0] = 'H';
+
+ const string str = "Test";
+ string str2 = str;
+ str.c_str(); // if you need a zero terminated string, use c_str()
+ string str3 = to_string(number);
+
+ delete[] pNumbers;
+ pNumbers = nullptr;
+ pVoidNumbers = nullptr;
+ pNumber = nullptr;
+ pSmallPositiveNumber = nullptr;
+ pFNumber = nullptr;
+ pMonster = nullptr;
+ delete pMonster2;
+ pMonster2 = nullptr;
+ delete pMonster3;
+ pMonster3 = nullptr;
+
+ return 0;
+}
diff --git a/CPlusPlus/Collections/.idea/.gitignore b/CPlusPlus/Collections/.idea/.gitignore
new file mode 100644
index 0000000..30cf57e
--- /dev/null
+++ b/CPlusPlus/Collections/.idea/.gitignore
@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Ignored default folder with query files
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/CPlusPlus/Collections/.idea/encodings.xml b/CPlusPlus/Collections/.idea/encodings.xml
new file mode 100644
index 0000000..df87cf9
--- /dev/null
+++ b/CPlusPlus/Collections/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CPlusPlus/Collections/CMakeLists.txt b/CPlusPlus/Collections/CMakeLists.txt
new file mode 100644
index 0000000..2ac68ff
--- /dev/null
+++ b/CPlusPlus/Collections/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 4.3)
+project(Collections)
+
+set(CMAKE_CXX_STANDARD 20)
+
+add_executable(Collections main.cpp
+ helpers.h
+ helpers.cpp)
diff --git a/CPlusPlus/Collections/helpers.cpp b/CPlusPlus/Collections/helpers.cpp
new file mode 100644
index 0000000..2b49cb3
--- /dev/null
+++ b/CPlusPlus/Collections/helpers.cpp
@@ -0,0 +1,32 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#include "helpers.h"
+
+#include
+#include
+
+int calculateGridIndex(int row, int column)
+{
+ return row * COLUMNS + column;
+}
+
+void printArray(int numbers[])
+{
+ int length = sizeof(numbers) / sizeof(numbers[0]);
+ // int length2 = std::ranges::size(numbers);
+
+ for (int i = 0; i < length; ++i)
+ {
+ std::cout << "numbers[" << i << "]:" << numbers[i] << std::endl;
+ }
+}
+
+void printArray(int numbers[], size_t length)
+{
+ for (int i = 0; i < length; ++i)
+ {
+ std::cout << "numbers[" << i << "]:" << numbers[i] << std::endl;
+ }
+}
diff --git a/CPlusPlus/Collections/helpers.h b/CPlusPlus/Collections/helpers.h
new file mode 100644
index 0000000..b904370
--- /dev/null
+++ b/CPlusPlus/Collections/helpers.h
@@ -0,0 +1,26 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#ifndef COLLECTIONS_HELPERS_H
+#define COLLECTIONS_HELPERS_H
+
+#include
+
+#define ROWS 5
+#define COLUMNS 10
+
+int calculateGridIndex(int row, int column);
+void printArray(int numbers[]);
+void printArray(int numbers[], size_t length);
+
+template
+void printVector(std::vector numbers)
+{
+ for (int i = 0; i < numbers.size(); ++i)
+ {
+ std::cout << "numbers[" << i << "]:" << numbers[i] << std::endl;
+ }
+}
+
+#endif //COLLECTIONS_HELPERS_H
diff --git a/CPlusPlus/Collections/main.cpp b/CPlusPlus/Collections/main.cpp
new file mode 100644
index 0000000..734f43c
--- /dev/null
+++ b/CPlusPlus/Collections/main.cpp
@@ -0,0 +1,141 @@
+#include
+#include
+#include
+
+#include "helpers.h"
+
+using namespace std;
+
+// int main()
+int main(int argc, char* argv[])
+{
+ // C arrays
+ int numbers[10];
+
+ for (int i = 0; i < 10; ++i)
+ {
+ numbers[i] = 0;
+ }
+
+ int numbers2[] = {0, 1, 2, 3, 4};
+ int numbers3[10] = {0, 1, 2, 3, 4};
+
+ numbers[0] = 1;
+
+ cout << "numbers[5]: " << numbers[5] << endl;
+ cout << "numbers2[5]: " << numbers2[5] << endl;
+ cout << "numbers3[5]: " << numbers3[5] << endl;
+
+ // 2D array - 10 columns, 5 rows
+ int grid[ROWS * COLUMNS] = {};
+ grid[calculateGridIndex(0, 0)] = 1;
+
+ int grid2[ROWS][COLUMNS] = {};
+
+ // size of an array has to be constant always
+ const int COUNT = 10;
+ int numbers4[COUNT] = {};
+
+ // "dynamic" heap arrays
+ int count2 = 10;
+ int* pNumbers = new int[count2];
+ pNumbers[0] = 1;
+ int* pNumbers2 = pNumbers; // pointer looks onto first element
+ for (size_t i = 0; i < count2; i++) // size can't be used for heap arrays
+ {
+ cout << pNumbers2 << ": " << *pNumbers2 << endl;
+ pNumbers2++;
+ }
+ delete[] pNumbers; // CAUTION - heap arrays have to be deleted with delete[]
+ pNumbers = pNumbers2 = nullptr;
+
+ // 2d heap arrays
+ int** pGrid = new int*[ROWS];
+ for (size_t i = 0; i < ROWS; i++)
+ {
+ pGrid[i] = new int[COLUMNS];
+ }
+
+ for (size_t i = 0; i < ROWS; i++)
+ {
+ // delete inner arrays first
+ delete[] pGrid[i];
+ pGrid[i] = nullptr;
+ }
+ delete[] pGrid; // delete outer array
+ pGrid = nullptr;
+
+ int length = sizeof(numbers) / sizeof(numbers[0]);
+ int length2 = size(numbers);
+
+ printArray(numbers);
+ printArray(numbers, length);
+
+ // stl collections
+ std::vector numbers5 = {0, 1, 2, 3, 4};
+ vector numbers6;
+ vector numbers7(100);
+
+ cout << "numbers5 size is " << numbers5.size() << " of " << numbers5.capacity() << endl;
+ cout << "numbers6 size is " << numbers6.size() << " of " << numbers6.capacity() << endl;
+ cout << "numbers7 size is " << numbers7.size() << " of " << numbers7.capacity() << endl;
+
+ numbers5.push_back(100);
+ numbers6.push_back(100);
+ numbers7.push_back(100);
+
+ cout << "numbers5 size is " << numbers5.size() << " of " << numbers5.capacity() << endl;
+ cout << "numbers6 size is " << numbers6.size() << " of " << numbers6.capacity() << endl;
+ cout << "numbers7 size is " << numbers7.size() << " of " << numbers7.capacity() << endl;
+
+ numbers5.pop_back();
+ numbers5.pop_back();
+ // numbers6.pop_back(); numbers6.pop_back(); // BE CAREFUL: also stl containers have no safety checks
+ numbers7.pop_back();
+ numbers7.pop_back();
+
+ cout << "numbers5 size is " << numbers5.size() << " of " << numbers5.capacity() << endl;
+ cout << "numbers6 size is " << numbers6.size() << " of " << numbers6.capacity() << endl;
+ cout << "numbers7 size is " << numbers7.size() << " of " << numbers7.capacity() << endl;
+
+ numbers6[0] = 200;
+ numbers6.reserve(1000);
+ numbers6.shrink_to_fit();
+
+ printArray(numbers6.data(), numbers6.size());
+
+ list numbers8;
+ list numbers9 = {0, 1, 2, 3, 4};
+ // numbers9[3] = 10; // random access is not available in list
+ list::iterator it = numbers9.begin();
+ for (; it != numbers9.end(); ++it)
+ {
+ cout << *it << " ";
+ }
+ cout << endl;
+
+ numbers9.push_front(-1);
+ numbers9.push_back(5);
+
+ it = numbers9.begin(); // -1
+ it++; // 0
+ it++; // 1
+ it++; // 2
+ numbers9.insert(it, 15);
+
+ for (it = numbers9.begin(); it != numbers9.end(); ++it)
+ {
+ cout << *it << " ";
+ }
+ cout << endl;
+
+ for (int n : numbers9)
+ {
+
+ }
+
+ for_each(numbers9.begin(), numbers9.end(), [](int n) { cout << n << " "; });
+ cout << endl;
+
+ return 0;
+}
diff --git a/CPlusPlus/Forward_Declaration/.idea/Forward_Declaration.iml b/CPlusPlus/Forward_Declaration/.idea/Forward_Declaration.iml
new file mode 100644
index 0000000..4c94235
--- /dev/null
+++ b/CPlusPlus/Forward_Declaration/.idea/Forward_Declaration.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/CPlusPlus/Forward_Declaration/CMakeLists.txt b/CPlusPlus/Forward_Declaration/CMakeLists.txt
new file mode 100644
index 0000000..db6f353
--- /dev/null
+++ b/CPlusPlus/Forward_Declaration/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 4.3)
+project(Forward_Declaration)
+
+set(CMAKE_CXX_STANDARD 20)
+
+add_executable(Forward_Declaration main.cpp
+ functions.h
+ functions.cpp)
diff --git a/CPlusPlus/Forward_Declaration/functions.cpp b/CPlusPlus/Forward_Declaration/functions.cpp
new file mode 100644
index 0000000..61ac917
--- /dev/null
+++ b/CPlusPlus/Forward_Declaration/functions.cpp
@@ -0,0 +1,6 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+#include "functions.h"
+
+void functionE() {} // defined
diff --git a/CPlusPlus/Forward_Declaration/functions.h b/CPlusPlus/Forward_Declaration/functions.h
new file mode 100644
index 0000000..8447923
--- /dev/null
+++ b/CPlusPlus/Forward_Declaration/functions.h
@@ -0,0 +1,14 @@
+//
+// Created by David Hackbarth on 21.09.26.
+//
+
+#pragma once
+
+#ifndef FORWARD_DECLARATION_FUNCTIONS_H
+#define FORWARD_DECLARATION_FUNCTIONS_H
+
+void functionE(); // declared
+
+// void functionF() {} // declared & defined, linker error when included multiple times
+
+#endif //FORWARD_DECLARATION_FUNCTIONS_H
diff --git a/CPlusPlus/Forward_Declaration/main.cpp b/CPlusPlus/Forward_Declaration/main.cpp
new file mode 100644
index 0000000..b8a4102
--- /dev/null
+++ b/CPlusPlus/Forward_Declaration/main.cpp
@@ -0,0 +1,22 @@
+#include "functions.h"
+
+void functionB() {} // declared & defined
+void functionC(); // declared
+void functionD(); // declared
+
+int main()
+{
+ // functionA(); // compiler error, because functionA is declared & defined after it is called
+ functionB(); // no error
+ // functionC(); // linker error, because functionC is declared but not defined
+ functionD(); // no error
+ functionE(); // no error
+
+ return 0;
+}
+
+void functionA() {} // declared & defined
+
+void functionD() {} // defined
+
+// void functionE() {} // linker error, because functionE is defined multiple times
\ No newline at end of file
diff --git a/CPlusPlus/Intro/CMakeLists.txt b/CPlusPlus/Intro/CMakeLists.txt
new file mode 100644
index 0000000..bc9de45
--- /dev/null
+++ b/CPlusPlus/Intro/CMakeLists.txt
@@ -0,0 +1,6 @@
+cmake_minimum_required(VERSION 4.3)
+project(Intro)
+
+set(CMAKE_CXX_STANDARD 20)
+
+add_executable(Intro main.cpp)
diff --git a/CPlusPlus/Intro/main.cpp b/CPlusPlus/Intro/main.cpp
new file mode 100644
index 0000000..e57fcdf
--- /dev/null
+++ b/CPlusPlus/Intro/main.cpp
@@ -0,0 +1,48 @@
+#include
+
+using namespace std;
+
+int main()
+{
+ // console output
+ std::cout << "Hello, World!" << std::endl;
+ std::cout << 1234 << std::endl;
+ std::cout << "Another test!\n";
+
+ cout << "It is also working without std::" << endl;
+
+ int number = 10;
+ cout << "number: " << number << endl;
+
+ // cout << L"This is a wide character string, but it is not supported by cout." << endl;
+
+ // console input
+ cin >> number;
+ cout << "number: " << number << endl;
+
+ char c;
+ cin >> c;
+ cout << "c: " << c << endl;
+
+ cin >> c >> number;
+ cout << "c: " << c << endl;
+ cout << "number: " << number << endl;
+
+ // boolean
+ bool b = 1; // 0 -> false, anything else -> true
+ cout << "b: " << b << endl;
+
+ if (number != 0)
+ {
+ // true
+ }
+ else
+ {
+ // false
+ }
+
+ // zero-terminated string
+ const char str[] = "Hello";
+
+ return 0;
+}
diff --git a/CPlusPlus/Pointers/CMakeLists.txt b/CPlusPlus/Pointers/CMakeLists.txt
new file mode 100644
index 0000000..383607b
--- /dev/null
+++ b/CPlusPlus/Pointers/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 4.3)
+project(Pointers)
+
+set(CMAKE_CXX_STANDARD 20)
+
+add_executable(Pointers main.cpp
+ helpers.h
+ helpers.cpp)
diff --git a/CPlusPlus/Pointers/helpers.cpp b/CPlusPlus/Pointers/helpers.cpp
new file mode 100644
index 0000000..9cd0878
--- /dev/null
+++ b/CPlusPlus/Pointers/helpers.cpp
@@ -0,0 +1,42 @@
+//
+// Created by David Hackbarth on 22.09.26.
+//
+#include "helpers.h"
+
+void changeInteger(int value)
+{
+ value *= 10;
+}
+
+int changeIntegerByReturn(int value)
+{
+ return value * 10;
+}
+
+bool changeIntegerByPointer(int* pValue)
+{
+ if (pValue == nullptr)
+ return false;
+
+ *pValue *= 10;
+
+ return true;
+}
+
+void changeIntegerByReference(int& value)
+{
+ value *= 10;
+}
+
+void createInteger(int* pNumber)
+{
+ pNumber = new int(0);
+}
+
+void createIntegerWithPointerPointer(int** ppNumber)
+{
+ if (ppNumber == nullptr)
+ return;
+
+ *ppNumber = new int(0);
+}
diff --git a/CPlusPlus/Pointers/helpers.h b/CPlusPlus/Pointers/helpers.h
new file mode 100644
index 0000000..2947354
--- /dev/null
+++ b/CPlusPlus/Pointers/helpers.h
@@ -0,0 +1,26 @@
+//
+// Created by David Hackbarth on 22.09.26.
+//
+
+#ifndef POINTERS_HELPERS_H
+#define POINTERS_HELPERS_H
+
+void changeInteger(int value);
+int changeIntegerByReturn(int value);
+bool changeIntegerByPointer(int* pValue);
+void changeIntegerByReference(int& value);
+
+void createInteger(int* pNumber);
+void createIntegerWithPointerPointer(int** ppNumber);
+
+template
+void safeDelete(T*& ptr)
+{
+ if (ptr != nullptr)
+ {
+ delete ptr;
+ ptr = nullptr;
+ }
+}
+
+#endif //POINTERS_HELPERS_H
diff --git a/CPlusPlus/Pointers/main.cpp b/CPlusPlus/Pointers/main.cpp
new file mode 100644
index 0000000..4b8b18d
--- /dev/null
+++ b/CPlusPlus/Pointers/main.cpp
@@ -0,0 +1,112 @@
+#include
+#include
+
+#include "helpers.h"
+
+using namespace std;
+
+int main()
+{
+ // general
+ int* pNumber = nullptr; // always initialize pointers
+ pNumber = new int(0); // create a new integer on the heap and assign its address to pNumber
+
+ cout << "pointer address: " << &pNumber << endl;
+ cout << "pointer size: " << sizeof(pNumber) << endl;
+ cout << "integer address: " << pNumber << endl;
+ cout << "integer size: " << sizeof(*pNumber) << endl;
+
+ *pNumber = 100;
+ cout << "integer value: " << *pNumber << endl;
+
+ // BAD BAD - memory leak, because we override the old address with a
+ // new one without saving or deleting the old data
+ // pNumber = new int(0);
+
+ // here are 100s lines of code
+
+ if (pNumber != nullptr)
+ {
+ delete pNumber; // will delete the integer on the heap
+ pNumber = nullptr;
+ }
+
+ safeDelete(pNumber);
+
+ // pointer as references outside local scope
+ int number = 10;
+ changeInteger(number);
+ number = changeIntegerByReturn(number);
+ changeIntegerByPointer(&number);
+ changeIntegerByPointer(pNumber);
+ changeIntegerByReference(number);
+
+ // smart pointer
+ // unique_ptr - only onw owner exist for the pointer
+ // shared_ptr - can have multiple owners
+ // weak_ptr - is a loose connection to a shared pointer
+
+ unique_ptr pNumberUnique = make_unique(0);
+ *pNumberUnique = 100;
+ // unique_ptr pNumberUnique2 = pNumberUnique; // compiler error - you can't create a copy of a unique pointer
+ unique_ptr pNumberUnique2 = make_unique(*pNumberUnique);
+
+ shared_ptr pNumberShared = make_shared(0);
+ shared_ptr pNumberShared2 = pNumberShared;
+
+ *pNumberShared2 = 100;
+
+ pNumberShared.reset();
+
+ weak_ptr pNumberWeak = pNumberShared2;
+ // *pNumberWeak = 1000; // compiler error - weak pointer can't be dereferenced
+
+ if (!pNumberWeak.expired())
+ {
+ shared_ptr tmpNumberShared = pNumberWeak.lock();
+ *tmpNumberShared = 1000;
+ }
+
+ pNumberShared2.reset();
+ shared_ptr pNumberShared3 = pNumberWeak.lock();
+ if (pNumberShared3 != nullptr)
+ {
+ *pNumberShared3 = 10000;
+ }
+
+ // pointer-pointer
+ createInteger(pNumber); // BAD BAD - memory leak created
+ createIntegerWithPointerPointer(&pNumber);
+
+ safeDelete(pNumber);
+
+ // const examples
+ const int constNumber = 10; // a constant value has to be directly initialized
+ // constNumber = 20; // a const value can't be changed
+
+ const int* constNumberPointer;
+ // *constNumberPointer = 20; // a const value can't be changed
+ constNumberPointer = new int(20); // the pointer isn't constant
+
+ int const* numberConstPointer;
+ // *numberConstPointer = 20; // a const value can't be changed
+ numberConstPointer = new int(20); // the pointer isn't constant
+
+ int* const numberPointerConst = new int(10); // a constant pointer has to be directly initialized
+ *numberPointerConst = 20; // the value can be changed, because it is not constant
+ // numberPointerConst = new int(20); // a const pointer can't be changed
+
+ // const int const * constNumberConstPointer; // not working at all, because of duplicated const expression
+
+ const int* const constNumberPointerConst = new int(10); // a constant pointer has to be directly initialized
+ // *constNumberPointerConst = 20; // a const value can't be changed
+ // constNumberPointerConst = new int(20); // a const pointer can't be changed
+
+ int const* const numberConstPointerConst = new int(10); // a constant pointer has to be directly initialized
+ // *numberConstPointerConst = 20; // a const value can't be changed
+ // numberConstPointerConst = new int(20); // a const pointer can't be changed
+
+ // const int const * const constNumberConstPointerConst; // not working at all, because of duplicated const expression
+
+ return 0;
+}