diff --git a/CPlusPlus/Classes/Classes.vcxproj b/CPlusPlus/Classes/Classes.vcxproj index a84dfbb..9709639 100644 --- a/CPlusPlus/Classes/Classes.vcxproj +++ b/CPlusPlus/Classes/Classes.vcxproj @@ -183,9 +183,11 @@ + + diff --git a/CPlusPlus/Classes/Classes.vcxproj.filters b/CPlusPlus/Classes/Classes.vcxproj.filters index c37c9a3..1ce6882 100644 --- a/CPlusPlus/Classes/Classes.vcxproj.filters +++ b/CPlusPlus/Classes/Classes.vcxproj.filters @@ -41,5 +41,11 @@ Header Files + + 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..e0eb7f1 --- /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; } // only for demonstration + virtual ~ICompareable() { std::cout << "ICompareable::~ICompareable()" << std::endl; } // only for demonstration + + virtual int Compare(ICompareable* pOther) = 0; +}; \ No newline at end of file diff --git a/CPlusPlus/Classes/Monster.cpp b/CPlusPlus/Classes/Monster.cpp index 77bcfd8..16b5db6 100644 --- a/CPlusPlus/Classes/Monster.cpp +++ b/CPlusPlus/Classes/Monster.cpp @@ -1,6 +1,35 @@ #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; + } +} + +int Monster::Compare(ICompareable* pOther) +{ + return 0; } diff --git a/CPlusPlus/Classes/Monster.h b/CPlusPlus/Classes/Monster.h index 383627b..03672dc 100644 --- a/CPlusPlus/Classes/Monster.h +++ b/CPlusPlus/Classes/Monster.h @@ -1,11 +1,24 @@ #pragma once #include "Entity.h" +#include "ICompareable.h" +#include "Vector3.h" +#include "Weapon.h" -class Monster : public Entity +class Monster : public Entity, public ICompareable { public: + // default constructor, copy constructor & destructor if you need one you'll need all of them + // internal pointers often requires default & copy constructor & a destructor at the same time Monster(); + Monster(const Monster& other); // copy constructor + virtual ~Monster(); std::string toString() override { return "Monster"; } + + virtual void Move(Vector3 move) = 0; + int Compare(ICompareable* pOther) override; + +private: + Weapon* _pWeapon = nullptr; }; diff --git a/CPlusPlus/Classes/Ork.cpp b/CPlusPlus/Classes/Ork.cpp index 35f3f25..0f8811f 100644 --- a/CPlusPlus/Classes/Ork.cpp +++ b/CPlusPlus/Classes/Ork.cpp @@ -1,6 +1,18 @@ #include "Ork.h" +#include Ork::Ork() { //toString(); + + std::cout << "Ork::Ork()" << std::endl; +} + +Ork::~Ork() +{ + std::cout << "Ork::~Ork()" << std::endl; +} + +void Ork::Move(Vector3 move) +{ } diff --git a/CPlusPlus/Classes/Ork.h b/CPlusPlus/Classes/Ork.h index 35d898a..4b04096 100644 --- a/CPlusPlus/Classes/Ork.h +++ b/CPlusPlus/Classes/Ork.h @@ -4,8 +4,11 @@ class Ork : public Monster { public: - Ork(); + Ork(); // constructor + virtual ~Ork(); // destructor std::string toString() override { return "Ork"; } + + void Move(Vector3 move) override; }; diff --git a/CPlusPlus/Classes/Weapon.h b/CPlusPlus/Classes/Weapon.h new file mode 100644 index 0000000..83b28c4 --- /dev/null +++ b/CPlusPlus/Classes/Weapon.h @@ -0,0 +1,4 @@ +#pragma once + +class Weapon +{ }; \ No newline at end of file diff --git a/CPlusPlus/Classes/main.cpp b/CPlusPlus/Classes/main.cpp index 24c2e56..e84db92 100644 --- a/CPlusPlus/Classes/main.cpp +++ b/CPlusPlus/Classes/main.cpp @@ -3,6 +3,8 @@ #include "Entity.h" #include "Monster.h" #include "Vector3.h" +#include "ICompareable.h" +#include "Ork.h" using namespace std; @@ -11,8 +13,9 @@ int main() Entity entity; // this is an entity instance cout << entity.toString() << endl; - Monster monster; - cout << monster.toString() << endl; + // can't be instantiated because of abstract method + //Monster monster; + //cout << monster.toString() << endl; Vector3 position; Vector3 position2(1.0f, 0.0f, -10.0f); @@ -20,5 +23,27 @@ int main() Vector3 position4{}; // list-initializer Vector3 position5 = {}; // list-initializer assigned + Ork ork; + + 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(&ork); + delete pComparables[i]; + pComparables[i] = nullptr; + } + + // creates an "dynamic" heap pointer array + ICompareable** pHeapComparables = new ICompareable*[10]; + delete[] pHeapComparables; + pHeapComparables = nullptr; + + Ork ork2 = ork; // should be a individual instances with their own values and weapons + return 0; } \ No newline at end of file diff --git a/CPlusPlus/Collections/main.cpp b/CPlusPlus/Collections/main.cpp index 654c543..399d5c6 100644 --- a/CPlusPlus/Collections/main.cpp +++ b/CPlusPlus/Collections/main.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "grid.h" @@ -44,7 +45,18 @@ int main() printArray(numbers); printArray(numbers, size(numbers)); - // "dynamic" (...) arrays + // "dynamic" (heap) arrays + int count2 = 10; + int* pNumbers = new int[count2]; + pNumbers[0] = 10; + 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; // stl collections vector numbers5; @@ -62,6 +74,30 @@ int main() numbersList.push_back(10); numbersList.push_front(0); //numbersList[0] = 5; // 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) + { + + } + + for_each(numbers6.begin(), numbers6.end(), [](const int& n) { + cout << n << " "; + }); + cout << endl; return 0; } diff --git a/CPlusPlus/Pointers/functions.cpp b/CPlusPlus/Pointers/functions.cpp index 16d00f5..14f5058 100644 --- a/CPlusPlus/Pointers/functions.cpp +++ b/CPlusPlus/Pointers/functions.cpp @@ -24,3 +24,17 @@ bool changeIntegerPerReference(int& n) n *= 2; return true; } + +bool createInteger(int* pN) +{ + pN = new int(0); // BAD BAD - creates a memory leak + + return false; +} + +bool createIntegerWithPointerPointer(int** ppN) +{ + *ppN = new int(0); + + return true; +} diff --git a/CPlusPlus/Pointers/functions.h b/CPlusPlus/Pointers/functions.h index d223ff1..635008d 100644 --- a/CPlusPlus/Pointers/functions.h +++ b/CPlusPlus/Pointers/functions.h @@ -3,4 +3,7 @@ void changeInteger(int n); int changeIntegerPerReturn(int n); bool changeIntegerPerPointer(int* pN); -bool changeIntegerPerReference(int& n); \ No newline at end of file +bool changeIntegerPerReference(int& n); + +bool createInteger(int* pN); +bool createIntegerWithPointerPointer(int** ppN); \ No newline at end of file diff --git a/CPlusPlus/Pointers/main.cpp b/CPlusPlus/Pointers/main.cpp index 58c28d1..1d3a9c4 100644 --- a/CPlusPlus/Pointers/main.cpp +++ b/CPlusPlus/Pointers/main.cpp @@ -1,4 +1,5 @@ #include +#include #include "functions.h" @@ -33,5 +34,45 @@ int main() changeIntegerPerPointer(pNumber); changeIntegerPerReference(number); + // smart pointer + // unique_ptr - only one owner exist for the object + // shared_ptr - can have multiple owners + // weak_ptr - is a loose connection to a shared pointer + + unique_ptr pNumber2 = make_unique(10); + *pNumber2 = 100; + //unique_ptr pNumber3 = pNumber2; // compiler error- you can't create a copy of an unique pointer + unique_ptr pNumber4 = make_unique(*pNumber2); + + shared_ptr pNumber5 = make_shared(10); + shared_ptr pNumber6 = pNumber5; + + *pNumber6 = 100; + + pNumber5.reset(); + + weak_ptr pNumber7 = pNumber6; + //*pNumber7 = 1000; // compiler error, weak pointer has no direct access to a shared pointer, you have to create a new shared pointer + + if (!pNumber7.expired()) + { + shared_ptr tmpSharedNumber = pNumber7.lock(); + *tmpSharedNumber = 10000; + } + + pNumber6.reset(); + shared_ptr tmpSharedNumber2 = pNumber7.lock(); + if (tmpSharedNumber2 != nullptr) *tmpSharedNumber2 = 100000; + + // pointer-pointer + createInteger(pNumber); + createIntegerWithPointerPointer(&pNumber); + + if (pNumber != nullptr) + { + delete pNumber; + pNumber = nullptr; + } + return 0; } \ No newline at end of file