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; +}