From 5894f4008eaaaa6ada3131feaf9b312bc950f678 Mon Sep 17 00:00:00 2001 From: David Hackbarth Date: Tue, 23 Sep 2025 12:42:50 +0200 Subject: [PATCH] add pointer in classes add interfaces --- CPlusPlus/Classes/Classes.vcxproj | 1 + CPlusPlus/Classes/Classes.vcxproj.filters | 3 ++ CPlusPlus/Classes/ICompareable.h | 13 ++++++ CPlusPlus/Classes/Monster.cpp | 26 ++++++++++- CPlusPlus/Classes/Monster.h | 17 ++++++- CPlusPlus/Classes/Ork.cpp | 17 +++++++ CPlusPlus/Classes/Ork.h | 3 ++ CPlusPlus/Classes/main.cpp | 22 ++++++++- CPlusPlus/Collections/main.cpp | 56 ++++++++++++++++++++++- CPlusPlus/Pointer/main.cpp | 14 ++++++ 10 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 CPlusPlus/Classes/ICompareable.h diff --git a/CPlusPlus/Classes/Classes.vcxproj b/CPlusPlus/Classes/Classes.vcxproj index f058bf7..ffecaf0 100644 --- a/CPlusPlus/Classes/Classes.vcxproj +++ b/CPlusPlus/Classes/Classes.vcxproj @@ -184,6 +184,7 @@ + diff --git a/CPlusPlus/Classes/Classes.vcxproj.filters b/CPlusPlus/Classes/Classes.vcxproj.filters index b33eb78..21955b3 100644 --- a/CPlusPlus/Classes/Classes.vcxproj.filters +++ b/CPlusPlus/Classes/Classes.vcxproj.filters @@ -47,5 +47,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/CPlusPlus/Classes/ICompareable.h b/CPlusPlus/Classes/ICompareable.h new file mode 100644 index 0000000..f366b7a --- /dev/null +++ b/CPlusPlus/Classes/ICompareable.h @@ -0,0 +1,13 @@ +#pragma once + +// only for demonstration +#include + +class ICompareable +{ +public: + ICompareable() { std::cout << "ICompareable::ICompareable()" << std::endl; } // constructor, only for demonstration + virtual ~ICompareable() { std::cout << "ICompareable::~ICompareable()" << std::endl; } // destructor + + virtual bool Compare(const ICompareable* pOther) = 0; // pure virtual - abstract method +}; \ No newline at end of file diff --git a/CPlusPlus/Classes/Monster.cpp b/CPlusPlus/Classes/Monster.cpp index df69f4e..e588275 100644 --- a/CPlusPlus/Classes/Monster.cpp +++ b/CPlusPlus/Classes/Monster.cpp @@ -1,6 +1,30 @@ #include "Monster.h" +#include -Monster::Monster() +Monster::Monster() : _pWeapon(new Weapon()) { //ToString(); + + std::cout << "Monster::Monster()" << std::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() +{ + std::cout << "Monster::~Monster()" << std::endl; + + if (_pWeapon != nullptr) + { + delete _pWeapon; + _pWeapon = nullptr; + } } diff --git a/CPlusPlus/Classes/Monster.h b/CPlusPlus/Classes/Monster.h index 5e1550e..d368d41 100644 --- a/CPlusPlus/Classes/Monster.h +++ b/CPlusPlus/Classes/Monster.h @@ -1,10 +1,25 @@ #pragma once #include "Entity.h" +#include "Vector3.h" +#include "ICompareable.h" +#include "Weapon.h" -class Monster : public MyNamespace::Entity +class Monster : public MyNamespace::Entity, public ICompareable { public: + // constructor, copy-constructor & destructor, + // if you need one, you'll need all of them + // internal pointers often requires constrcutor, copy-constructor & destructor Monster(); + //Monster(Weapon* weapon); + Monster(const Monster& other); + virtual ~Monster(); std::string ToString() override { return "Monster"; } + + virtual void Move(const Vector3& move) = 0; + bool Compare(const ICompareable* pOther) override; + +protected: + Weapon* _pWeapon = nullptr; }; \ No newline at end of file diff --git a/CPlusPlus/Classes/Ork.cpp b/CPlusPlus/Classes/Ork.cpp index eb197d9..879eb53 100644 --- a/CPlusPlus/Classes/Ork.cpp +++ b/CPlusPlus/Classes/Ork.cpp @@ -1,6 +1,23 @@ #include "Ork.h" +#include Ork::Ork() { //ToString(); + + std::cout << "Ork::Ork()" << std::endl; +} + +Ork::~Ork() +{ + std::cout << "Ork::~Ork()" << std::endl; +} + +void Ork::Move(const Vector3& move) +{ +} + +bool Monster::Compare(const ICompareable* pOther) +{ + return false; } diff --git a/CPlusPlus/Classes/Ork.h b/CPlusPlus/Classes/Ork.h index 7ec2465..e659ce5 100644 --- a/CPlusPlus/Classes/Ork.h +++ b/CPlusPlus/Classes/Ork.h @@ -5,6 +5,9 @@ class Ork : public Monster { public: Ork(); + ~Ork(); std::string ToString() override { return "Ork"; } + + void Move(const Vector3& move) override; }; \ No newline at end of file diff --git a/CPlusPlus/Classes/main.cpp b/CPlusPlus/Classes/main.cpp index 255d146..f350e94 100644 --- a/CPlusPlus/Classes/main.cpp +++ b/CPlusPlus/Classes/main.cpp @@ -2,6 +2,7 @@ #include "Entity.h" #include "Monster.h" #include "Vector3.h" +#include "Ork.h" using namespace MyNamespace; using namespace std; @@ -11,12 +12,29 @@ int main() Entity entity; // this is an instance cout << entity.ToString() << endl; - Monster monster; - cout << monster.ToString() << endl; + // can't be instantiated, because it is abstract + //Monster monster; + //cout << monster.ToString() << endl; Vector3 position(1.0f, 0.0f, 2.0f); Vector3 position2 = Vector3(); Vector3 position3{}; // list-initializer + Ork ork; + ork.Move(position); + + Monster* pMonster = new Ork(); + delete pMonster; + pMonster = nullptr; + + ICompareable* pCompareables[] = { new Ork, new Ork, new Ork }; + for (size_t i = 0; i < size(pCompareables); i++) + { + delete pCompareables[i]; + pCompareables[i] = nullptr; + } + + Ork ork2 = ork; + return 0; } \ No newline at end of file diff --git a/CPlusPlus/Collections/main.cpp b/CPlusPlus/Collections/main.cpp index ec1da44..b4c1589 100644 --- a/CPlusPlus/Collections/main.cpp +++ b/CPlusPlus/Collections/main.cpp @@ -1,6 +1,7 @@ #include #include #include +#include using namespace std; @@ -42,7 +43,38 @@ int main() printArray(numbers4); printArray(numbers4, size(numbers4)); - // "dynamic" (...) arrays + // "dynamic" heap arrays + int count2 = 10; + int* pNumbers = new int[count2]; + pNumbers[0] = 10; + int* pNumber = pNumbers; // pNumber points onto the first element + //pNumber++; // pNumber points onto the second element + //pNumber--; + //pNumber += 2; + cout << "\"dynamic\" heap arrays" << endl; + for (size_t i = 0; i < count2; i++) // CAUTION - size is not working with heap arrays, we have to remember the size of the array + { + cout << pNumber << ": " << *pNumber << endl; + pNumber++; + } + delete[] pNumbers; // CAUTION - heap arrays have to be deleted with delete[] + pNumbers = pNumber = nullptr; + + // 2d arrays + int** p2dArray = new int* [10]; + for (size_t i = 0; i < 10; i++) + { + p2dArray[i] = new int[10]; + } + + // for delete -> delete inner arrays first + for (size_t i = 0; i < 10; i++) + { + delete[] p2dArray[i]; + p2dArray[i] = nullptr; + } + delete[] p2dArray; // then outer array + p2dArray = nullptr; // stl collections vector numbers5; @@ -60,6 +92,28 @@ int main() numbersList.push_back(10); numbersList.push_front(0); //numbersList[0] = 100; // random access is not available for lists + list::iterator it = numbersList.begin(); + for (; it != numbersList.end(); it++) + { + cout << *it << " "; + } + cout << endl; + + numbersList.insert(--it, 20); + + for (it = numbersList.begin(); it != numbersList.end(); it++) + { + cout << *it << " "; + } + cout << endl; + + for (int n : numbersList) + { } + + // https://cppreference.com/w/cpp/algorithm.html + for_each(numbersList.begin(), numbersList.end(), [](const int& n) { + + }); return 0; } diff --git a/CPlusPlus/Pointer/main.cpp b/CPlusPlus/Pointer/main.cpp index dc3d6f7..8cb5a53 100644 --- a/CPlusPlus/Pointer/main.cpp +++ b/CPlusPlus/Pointer/main.cpp @@ -65,5 +65,19 @@ int main() shared_ptr pTmpSharedPointer2 = pNumber7.lock(); if (pTmpSharedPointer2 != nullptr) *pTmpSharedPointer2 = 10; // smart pointer are no guarantee for a valid object behind the pointer + // const exercise + // int * + // const int * + // int const * + // int * const + // const int * const + // int const * const + // const int const * const + // const int const const * const + + // const int* pNumber = new int(0); + // *pNumber = 10; // is this working + // pNumber = new int(0); // is this working + return 0; } \ No newline at end of file