From 4b6ac6a48484646d0fa5a4a4126024822a7500c0 Mon Sep 17 00:00:00 2001 From: David Hackbarth Date: Wed, 26 Mar 2025 12:44:05 +0100 Subject: [PATCH] add pointer add "dynamic" heap array add polymorphic --- CPlusPlus/CPlusPlus.sln | 14 ++ CPlusPlus/Classes/Entity.cpp | 4 + CPlusPlus/Classes/Entity.h | 1 + CPlusPlus/Classes/ICompareable.h | 2 + CPlusPlus/Classes/Monster.cpp | 4 + CPlusPlus/Classes/Monster.h | 1 + CPlusPlus/Classes/Ork.cpp | 10 ++ CPlusPlus/Classes/Ork.h | 4 +- CPlusPlus/Classes/main.cpp | 17 ++ CPlusPlus/Collections/main.cpp | 13 ++ CPlusPlus/Pointer/Pointer.vcxproj | 190 ++++++++++++++++++++++ CPlusPlus/Pointer/Pointer.vcxproj.filters | 22 +++ CPlusPlus/Pointer/main.cpp | 58 +++++++ 13 files changed, 339 insertions(+), 1 deletion(-) create mode 100644 CPlusPlus/Pointer/Pointer.vcxproj create mode 100644 CPlusPlus/Pointer/Pointer.vcxproj.filters create mode 100644 CPlusPlus/Pointer/main.cpp diff --git a/CPlusPlus/CPlusPlus.sln b/CPlusPlus/CPlusPlus.sln index add3712..de97646 100644 --- a/CPlusPlus/CPlusPlus.sln +++ b/CPlusPlus/CPlusPlus.sln @@ -11,6 +11,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Classes", "Classes\Classes. EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Collections", "Collections\Collections.vcxproj", "{1B177393-37B1-4C7B-BCF0-163991832930}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Pointer", "Pointer\Pointer.vcxproj", "{860DAD08-212F-4265-B3F8-8BBF85AA4833}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 @@ -69,6 +71,18 @@ Global {1B177393-37B1-4C7B-BCF0-163991832930}.Release|x64.Build.0 = Release|x64 {1B177393-37B1-4C7B-BCF0-163991832930}.Release|x86.ActiveCfg = Release|Win32 {1B177393-37B1-4C7B-BCF0-163991832930}.Release|x86.Build.0 = Release|Win32 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Debug|ARM64.Build.0 = Debug|ARM64 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Debug|x64.ActiveCfg = Debug|x64 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Debug|x64.Build.0 = Debug|x64 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Debug|x86.ActiveCfg = Debug|Win32 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Debug|x86.Build.0 = Debug|Win32 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Release|ARM64.ActiveCfg = Release|ARM64 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Release|ARM64.Build.0 = Release|ARM64 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Release|x64.ActiveCfg = Release|x64 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Release|x64.Build.0 = Release|x64 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Release|x86.ActiveCfg = Release|Win32 + {860DAD08-212F-4265-B3F8-8BBF85AA4833}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/CPlusPlus/Classes/Entity.cpp b/CPlusPlus/Classes/Entity.cpp index d3f939e..ae59f18 100644 --- a/CPlusPlus/Classes/Entity.cpp +++ b/CPlusPlus/Classes/Entity.cpp @@ -11,6 +11,10 @@ Entity::Entity(std::string name) : name(name) //this->name = name; } +Entity::~Entity() +{ +} + std::string Entity::ToString() { return name; diff --git a/CPlusPlus/Classes/Entity.h b/CPlusPlus/Classes/Entity.h index 891d032..7267121 100644 --- a/CPlusPlus/Classes/Entity.h +++ b/CPlusPlus/Classes/Entity.h @@ -6,6 +6,7 @@ class Entity public: Entity(); Entity(std::string name); + virtual ~Entity(); virtual std::string ToString(); diff --git a/CPlusPlus/Classes/ICompareable.h b/CPlusPlus/Classes/ICompareable.h index 7c86328..5852c4b 100644 --- a/CPlusPlus/Classes/ICompareable.h +++ b/CPlusPlus/Classes/ICompareable.h @@ -3,5 +3,7 @@ class ICompareable { public: + virtual ~ICompareable() {} + virtual int Compare(ICompareable* other) = 0; }; \ No newline at end of file diff --git a/CPlusPlus/Classes/Monster.cpp b/CPlusPlus/Classes/Monster.cpp index c5512c4..a82dfaa 100644 --- a/CPlusPlus/Classes/Monster.cpp +++ b/CPlusPlus/Classes/Monster.cpp @@ -7,6 +7,10 @@ Monster::Monster(int strength) : Entity("My Monster"), _strength(strength) this->name = "My Monster"; } +Monster::~Monster() +{ +} + //Monster Monster::Create(Monsters type) //{ // Monster monster; diff --git a/CPlusPlus/Classes/Monster.h b/CPlusPlus/Classes/Monster.h index 4c55902..44b3203 100644 --- a/CPlusPlus/Classes/Monster.h +++ b/CPlusPlus/Classes/Monster.h @@ -13,6 +13,7 @@ class Monster : public Entity, public ICompareable { public: Monster(int strength); + virtual ~Monster(); //static Monster Create(Monsters type); diff --git a/CPlusPlus/Classes/Ork.cpp b/CPlusPlus/Classes/Ork.cpp index 8f051da..874c0f9 100644 --- a/CPlusPlus/Classes/Ork.cpp +++ b/CPlusPlus/Classes/Ork.cpp @@ -6,6 +6,16 @@ Ork::Ork() : Monster(10) this->name = "My Ork"; } +Ork::Ork(const Ork& other) : Monster(other._strength) +{ + this->name = other.name; + this->_speed = other._speed; +} + +Ork::~Ork() +{ +} + void Ork::Move() { } diff --git a/CPlusPlus/Classes/Ork.h b/CPlusPlus/Classes/Ork.h index e837f32..9d8ad15 100644 --- a/CPlusPlus/Classes/Ork.h +++ b/CPlusPlus/Classes/Ork.h @@ -4,7 +4,9 @@ class Ork : public Monster { public: - Ork(); + Ork(); // default constructor + Ork(const Ork&); // copy constructor + ~Ork(); // destructor void Move() override; }; diff --git a/CPlusPlus/Classes/main.cpp b/CPlusPlus/Classes/main.cpp index 18452e9..cf60a55 100644 --- a/CPlusPlus/Classes/main.cpp +++ b/CPlusPlus/Classes/main.cpp @@ -24,5 +24,22 @@ int main() Vector3 position(1.0f, 3.0f, -5.0f); position.y = 0.0f; + ICompareable* pComparable = nullptr; + pComparable = &ork; + pComparable->Compare(&ork); + (*pComparable).Compare(&ork); // same as line above, but more complicated to write + + ICompareable* pComparables[] = { new Ork, new Ork, new Ork }; + for (size_t i = 0; i < size(pComparables); i++) + { + //pComparables[i]->Compare(nullptr); + delete pComparables[i]; + pComparables[i] = nullptr; + } + + ICompareable** pHeapComparables = new ICompareable*[10]; + delete[] pHeapComparables; + pHeapComparables = nullptr; + return 0; } \ No newline at end of file diff --git a/CPlusPlus/Collections/main.cpp b/CPlusPlus/Collections/main.cpp index c17d520..bf780e8 100644 --- a/CPlusPlus/Collections/main.cpp +++ b/CPlusPlus/Collections/main.cpp @@ -51,6 +51,19 @@ int main() printArray(numbers2); printArray(numbers2, std::size(numbers2)); + // "dynamic" (heap) arrays + int count2 = 10; + int* heapNumbers = new int[count2]; + heapNumbers[0] = 10; + int* pHeapNumber = heapNumbers; + for (size_t i = 0; i < count2; i++) + { + cout << pHeapNumber << ": " << *pHeapNumber << " "; + pHeapNumber++; + } + delete[] heapNumbers; // CAUTION - heap arrays have to be deleted with delete[] not delete + heapNumbers = nullptr; + // stl collections vector numbers6; vector numbers7 = { 0, 1, 2, 3 }; diff --git a/CPlusPlus/Pointer/Pointer.vcxproj b/CPlusPlus/Pointer/Pointer.vcxproj new file mode 100644 index 0000000..d9a9aac --- /dev/null +++ b/CPlusPlus/Pointer/Pointer.vcxproj @@ -0,0 +1,190 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM64 + + + Release + ARM64 + + + + 17.0 + Win32Proj + {860dad08-212f-4265-b3f8-8bbf85aa4833} + Pointer + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/CPlusPlus/Pointer/Pointer.vcxproj.filters b/CPlusPlus/Pointer/Pointer.vcxproj.filters new file mode 100644 index 0000000..ce0c35c --- /dev/null +++ b/CPlusPlus/Pointer/Pointer.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/CPlusPlus/Pointer/main.cpp b/CPlusPlus/Pointer/main.cpp new file mode 100644 index 0000000..2c4c5d6 --- /dev/null +++ b/CPlusPlus/Pointer/main.cpp @@ -0,0 +1,58 @@ +#include + +using namespace std; + +void changeInteger(int n); +void changeIntegerPerPointer(int* pN); +int changeIntegerPerReturn(int n); +void changeIntegerPerReference(int& n); + +int main() +{ + // general + int* pNumber = nullptr; + pNumber = new int(0); + + cout << "size of pNumber: " << sizeof(pNumber) << endl; + cout << "size of pNumber data: " << sizeof(*pNumber) << endl; + + *pNumber = 567; + + //pNumber = new int(0); // BAD BAD - Memory Leak, because we override an existing pointer address with a new one without saving the old one + + // here are 100s of lines of code + + if (pNumber != nullptr) + { + delete pNumber; + pNumber = nullptr; + } + + // pointer as references + int number = 0; + changeInteger(number); + changeIntegerPerPointer(&number); + changeIntegerPerPointer(pNumber); + changeIntegerPerReference(number); + + return 0; +} + +void changeInteger(int n) +{ + n = 100; +} + +void changeIntegerPerPointer(int* pN) +{ + cout << "address of pN: " << &pN << endl; + + if (pN == nullptr) return; // BE CAREFUL - if you don't what you get, do a test before + + *pN = 200; +} + +void changeIntegerPerReference(int& n) +{ + n = 300; +}