diff --git a/CPlusPlus/Classes/Classes.vcxproj b/CPlusPlus/Classes/Classes.vcxproj index a3596ee..dce16fe 100644 --- a/CPlusPlus/Classes/Classes.vcxproj +++ b/CPlusPlus/Classes/Classes.vcxproj @@ -187,6 +187,7 @@ + @@ -194,6 +195,7 @@ + diff --git a/CPlusPlus/Classes/Classes.vcxproj.filters b/CPlusPlus/Classes/Classes.vcxproj.filters index 83cfedb..89bfd4e 100644 --- a/CPlusPlus/Classes/Classes.vcxproj.filters +++ b/CPlusPlus/Classes/Classes.vcxproj.filters @@ -27,6 +27,9 @@ Source Files + + Source Files + @@ -44,5 +47,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/CPlusPlus/Classes/Entity.cpp b/CPlusPlus/Classes/Entity.cpp index ae59f18..b9c60f8 100644 --- a/CPlusPlus/Classes/Entity.cpp +++ b/CPlusPlus/Classes/Entity.cpp @@ -3,16 +3,19 @@ Entity::Entity() { - + std::cout << "Create Entity" << std::endl; } Entity::Entity(std::string name) : name(name) { + std::cout << "Create Entity with name" << std::endl; + //this->name = name; } Entity::~Entity() { + std::cout << "Destroy Entity" << std::endl; } std::string Entity::ToString() diff --git a/CPlusPlus/Classes/ICompareable.h b/CPlusPlus/Classes/ICompareable.h index 5852c4b..25516ad 100644 --- a/CPlusPlus/Classes/ICompareable.h +++ b/CPlusPlus/Classes/ICompareable.h @@ -1,9 +1,15 @@ #pragma once +// only for presentation +#include + class ICompareable { public: - virtual ~ICompareable() {} + // only for presentation + ICompareable() { std::cout << "Create IComparable" << std::endl; } + + virtual ~ICompareable() { std::cout << "Destroy IComparable" << std::endl; } 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 a82dfaa..1d350e2 100644 --- a/CPlusPlus/Classes/Monster.cpp +++ b/CPlusPlus/Classes/Monster.cpp @@ -2,13 +2,40 @@ #include "Monster.h" -Monster::Monster(int strength) : Entity("My Monster"), _strength(strength) +Monster::Monster() : Entity("My Monster"), _pWeapon(new Weapon()) { + std::cout << "Create Monster" << std::endl; +} + +Monster::Monster(const Monster& other) : Entity(other), ICompareable(other) +{ + std::cout << "Create Copy of a Monster" << std::endl; + + // shallow copy + //this->_pWeapon = other._pWeapon; + this->_strength = other._strength; + this->_speed = other._speed; + + // deep copy of internal pointers + this->_pWeapon = new Weapon(*other._pWeapon); +} + +Monster::Monster(int strength) : Entity("My Monster"), _strength(strength), _pWeapon(new Weapon()) +{ + std::cout << "Create Monster with strength" << std::endl; + this->name = "My Monster"; } Monster::~Monster() { + std::cout << "Destroy Monster" << std::endl; + + if (_pWeapon != nullptr) + { + delete _pWeapon; + _pWeapon = nullptr; + } } //Monster Monster::Create(Monsters type) diff --git a/CPlusPlus/Classes/Monster.h b/CPlusPlus/Classes/Monster.h index 44b3203..014a209 100644 --- a/CPlusPlus/Classes/Monster.h +++ b/CPlusPlus/Classes/Monster.h @@ -1,6 +1,8 @@ #pragma once + #include "Entity.h" #include "ICompareable.h" +#include "Weapon.h" //enum Monsters //{ @@ -12,6 +14,9 @@ class Monster : public Entity, public ICompareable { public: + // internal pointers often requires a default & copy constructor and a destructor + Monster(); + Monster(const Monster& other); Monster(int strength); virtual ~Monster(); @@ -22,6 +27,8 @@ public: int Compare(ICompareable* other) override; protected: + Weapon* _pWeapon = nullptr; + int _strength = 0; float _speed = 0.0f; }; diff --git a/CPlusPlus/Classes/Ork.cpp b/CPlusPlus/Classes/Ork.cpp index 874c0f9..373d84e 100644 --- a/CPlusPlus/Classes/Ork.cpp +++ b/CPlusPlus/Classes/Ork.cpp @@ -1,19 +1,24 @@ #include "Ork.h" +#include Ork::Ork() : Monster(10) { + std::cout << "Create Ork" << std::endl; + //this->_strength = 10; this->name = "My Ork"; } -Ork::Ork(const Ork& other) : Monster(other._strength) +Ork::Ork(const Ork& other) : Monster(other) { - this->name = other.name; - this->_speed = other._speed; + std::cout << "Create a copy of an Ork" << std::endl; + //this->name = other.name; + //this->_speed = other._speed; } Ork::~Ork() { + std::cout << "Destroy Ork" << std::endl; } void Ork::Move() diff --git a/CPlusPlus/Classes/Weapon.cpp b/CPlusPlus/Classes/Weapon.cpp new file mode 100644 index 0000000..7e71249 --- /dev/null +++ b/CPlusPlus/Classes/Weapon.cpp @@ -0,0 +1 @@ +#include "Weapon.h" diff --git a/CPlusPlus/Classes/Weapon.h b/CPlusPlus/Classes/Weapon.h new file mode 100644 index 0000000..174fba0 --- /dev/null +++ b/CPlusPlus/Classes/Weapon.h @@ -0,0 +1,5 @@ +#pragma once +class Weapon +{ +}; + diff --git a/CPlusPlus/Classes/main.cpp b/CPlusPlus/Classes/main.cpp index cf60a55..90ccc9d 100644 --- a/CPlusPlus/Classes/main.cpp +++ b/CPlusPlus/Classes/main.cpp @@ -8,38 +8,42 @@ using namespace std; int main() { - Entity entity; // this is an entity instance - entity.name = "My Entity"; + //Entity entity; // this is an entity instance + //entity.name = "My Entity"; //Monster monster; // can't be instantiated, because Monster is abstract //Monster monster2 = Monster::Create(Monsters::Ork); Ork ork; - ork.name = "My Ork"; + ork.name = "Ork1"; ork.Move(); - cout << entity.ToString() << endl; - cout << ork.ToString() << endl; + //cout << entity.ToString() << endl; + //cout << ork.ToString() << endl; - Vector3 position(1.0f, 3.0f, -5.0f); - position.y = 0.0f; + //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* 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* 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; + //ICompareable** pHeapComparables = new ICompareable*[10]; + //delete[] pHeapComparables; + //pHeapComparables = nullptr; + + //Ork ork2(ork); + //ork2.name = "Ork2"; + //ork2.Move(); return 0; } \ No newline at end of file diff --git a/CPlusPlus/Pointer/main.cpp b/CPlusPlus/Pointer/main.cpp index 2c4c5d6..5046a29 100644 --- a/CPlusPlus/Pointer/main.cpp +++ b/CPlusPlus/Pointer/main.cpp @@ -1,4 +1,5 @@ #include +#include // smart pointer header using namespace std; @@ -7,6 +8,9 @@ void changeIntegerPerPointer(int* pN); int changeIntegerPerReturn(int n); void changeIntegerPerReference(int& n); +bool createInteger(int* pN); +bool createIntegerWithPointerPointer(int** ppN); + int main() { // general @@ -18,7 +22,7 @@ int main() *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 + // 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 @@ -29,11 +33,57 @@ int main() } // pointer as references - int number = 0; - changeInteger(number); - changeIntegerPerPointer(&number); - changeIntegerPerPointer(pNumber); - changeIntegerPerReference(number); + //int number = 0; + //changeInteger(number); + //changeIntegerPerPointer(&number); + //changeIntegerPerPointer(pNumber); + //changeIntegerPerReference(number); + + // smart pointer + // unique_ptr -> only one owner exist for the object + // shared_ptr -> can have multiple owners + // weak_ptr -> is loose connection to a shared_ptr + + unique_ptr number = make_unique(10); + *number = 100; + //unique_ptr number2 = number; // compiler error - you can create a copy of an unique pointer + unique_ptr number2 = make_unique(*number); + + shared_ptr number3 = make_shared(20); + shared_ptr number4 = number3; + *number3 = 200; + *number4 = 2000; + + number3.reset(); + + weak_ptr weakNumber = number4; + //*weakNumber = 20000; // compiler error, weak pointer have no direct access to a shared pointer, you have to create one + + if (!weakNumber.expired()) + { + shared_ptr tmpSharedNumber = weakNumber.lock(); + *tmpSharedNumber = 20000; + } + + number4.reset(); + shared_ptr tmpSharedNumber = weakNumber.lock(); + + // pointer-pointer + if (createInteger(pNumber)) + { + cout << "Create integer was succesful" << endl; + } + + if (createIntegerWithPointerPointer(&pNumber)) + { + cout << "Create integer was succesful" << endl; + } + + if (pNumber != nullptr) + { + delete pNumber; + pNumber = nullptr; + } return 0; } @@ -56,3 +106,17 @@ void changeIntegerPerReference(int& n) { n = 300; } + +bool createInteger(int* pN) +{ + pN = new int(0); // CAUTION - creates a MEMORY LEAK + + return false; +} + +bool createIntegerWithPointerPointer(int** ppN) +{ + *ppN = new int(0); + + return true; +}