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