aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp04/ex01/Character.cpp6
-rw-r--r--cpp04/ex01/Character.hpp2
-rw-r--r--cpp04/ex01/RadScorpion.hpp4
-rw-r--r--cpp04/ex01/SuperMutant.cpp4
-rw-r--r--cpp04/ex01/SuperMutant.hpp4
-rw-r--r--cpp04/ex01/main.cpp178
-rw-r--r--cpp04/ex02/AssaultTerminator.cpp11
-rw-r--r--cpp04/ex02/AssaultTerminator.hpp10
-rw-r--r--cpp04/ex02/Squad.cpp8
-rw-r--r--cpp04/ex02/Squad.hpp10
-rw-r--r--cpp04/ex02/TacticalMarine.cpp11
-rw-r--r--cpp04/ex02/TacticalMarine.hpp10
-rw-r--r--cpp04/ex02/main.cpp116
-rw-r--r--cpp04/ex03/AMateria.cpp20
-rw-r--r--cpp04/ex03/AMateria.hpp11
-rw-r--r--cpp04/ex03/Character.cpp24
-rw-r--r--cpp04/ex03/Character.hpp8
-rw-r--r--cpp04/ex03/Cure.cpp3
-rw-r--r--cpp04/ex03/Cure.hpp4
-rw-r--r--cpp04/ex03/ICharacter.hpp9
-rw-r--r--cpp04/ex03/IMateriaSource.hpp2
-rw-r--r--cpp04/ex03/Ice.cpp4
-rw-r--r--cpp04/ex03/Ice.hpp4
-rw-r--r--cpp04/ex03/MateriaSource.cpp28
-rw-r--r--cpp04/ex03/MateriaSource.hpp8
-rw-r--r--cpp04/ex03/main.cpp2
-rw-r--r--subjects/cpp04.en.pdfbin1391044 -> 1422231 bytes
27 files changed, 400 insertions, 101 deletions
diff --git a/cpp04/ex01/Character.cpp b/cpp04/ex01/Character.cpp
index 5f865c7..0952738 100644
--- a/cpp04/ex01/Character.cpp
+++ b/cpp04/ex01/Character.cpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 13:44:35 by charles #+# #+# */
-/* Updated: 2020/11/12 14:28:26 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 11:51:31 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -41,7 +41,7 @@ void Character::equip(AWeapon *weapon)
void Character::attack(Enemy *enemy)
{
- if (m_weapon == NULL || m_ap < m_weapon->getAPCost())
+ if (enemy == NULL || m_weapon == NULL || m_ap < m_weapon->getAPCost())
return;
std::cout << m_name << " attacks " << enemy->getType() << " with a " << m_weapon->getName() << std::endl;
m_weapon->attack();
@@ -49,6 +49,8 @@ void Character::attack(Enemy *enemy)
if (enemy->getHP() <= 0)
delete enemy;
m_ap -= m_weapon->getAPCost();
+ if (m_ap < 0)
+ m_ap = 0;
}
std::string const& Character::getName() const { return m_name; }
diff --git a/cpp04/ex01/Character.hpp b/cpp04/ex01/Character.hpp
index 817fd53..08f1b59 100644
--- a/cpp04/ex01/Character.hpp
+++ b/cpp04/ex01/Character.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 13:42:25 by charles #+# #+# */
-/* Updated: 2020/11/12 13:56:59 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 11:14:03 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
diff --git a/cpp04/ex01/RadScorpion.hpp b/cpp04/ex01/RadScorpion.hpp
index f07891e..70bac44 100644
--- a/cpp04/ex01/RadScorpion.hpp
+++ b/cpp04/ex01/RadScorpion.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 13:35:04 by charles #+# #+# */
-/* Updated: 2020/11/12 14:24:38 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 11:41:55 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -22,7 +22,7 @@ public:
RadScorpion();
RadScorpion(RadScorpion const& other);
RadScorpion& operator=(RadScorpion const& other);
- ~RadScorpion();
+ virtual ~RadScorpion();
private:
};
diff --git a/cpp04/ex01/SuperMutant.cpp b/cpp04/ex01/SuperMutant.cpp
index c9ce83c..8813217 100644
--- a/cpp04/ex01/SuperMutant.cpp
+++ b/cpp04/ex01/SuperMutant.cpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 13:30:47 by charles #+# #+# */
-/* Updated: 2020/11/12 13:54:19 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 10:35:24 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -35,5 +35,7 @@ SuperMutant::~SuperMutant()
void SuperMutant::takeDamage(int amount)
{
+ if (amount < 0)
+ amount = 3;
Enemy::takeDamage(amount - 3);
}
diff --git a/cpp04/ex01/SuperMutant.hpp b/cpp04/ex01/SuperMutant.hpp
index 64198de..4170a18 100644
--- a/cpp04/ex01/SuperMutant.hpp
+++ b/cpp04/ex01/SuperMutant.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 13:29:53 by charles #+# #+# */
-/* Updated: 2020/11/12 13:50:54 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 11:42:08 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -22,7 +22,7 @@ public:
SuperMutant();
SuperMutant(SuperMutant const& other);
SuperMutant& operator=(SuperMutant const& other);
- ~SuperMutant();
+ virtual ~SuperMutant();
virtual void takeDamage(int amount);
diff --git a/cpp04/ex01/main.cpp b/cpp04/ex01/main.cpp
index ca5b35e..5b907bd 100644
--- a/cpp04/ex01/main.cpp
+++ b/cpp04/ex01/main.cpp
@@ -6,19 +6,22 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 09:05:58 by charles #+# #+# */
-/* Updated: 2020/11/12 14:36:49 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 12:00:52 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
+#include <climits>
#include "Character.hpp"
+#include "Enemy.hpp"
#include "RadScorpion.hpp"
+#include "SuperMutant.hpp"
#include "PlasmaRifle.hpp"
#include "PowerFist.hpp"
int main()
{
{
- std::cout << "================ SUBJECT MAIN =====================" << std::endl;
+ std::cout << "================ SUBJECT MAIN =====================" << std::endl;
Character* me = new Character("me");
std::cout << *me;
Enemy* b = new RadScorpion();
@@ -36,7 +39,6 @@ int main()
me->attack(b);
std::cout << *me;
delete me;
- ((RadScorpion*)b)->~RadScorpion();
delete pr;
delete pf;
}
@@ -44,7 +46,177 @@ int main()
std::cout << std::endl;
{
+ std::cout << "================ PLASMA RIFLE =====================" << std::endl;
+ PlasmaRifle pr;
+ PlasmaRifle pr2(pr);
+ PlasmaRifle pr3;
+ pr3 = pr2;
+ std::cout << "Name: " << pr.getName() << std::endl;
+ std::cout << "AP Cost: " << pr.getAPCost() << std::endl;
+ std::cout << "Damage: " << pr.getDamage() << std::endl;
+ pr.attack();
+ pr2.attack();
+ pr3.attack();
+ std::cout << "################ VIRTUAL" << std::endl;
+ AWeapon *w = &pr;
+ std::cout << "Name: " << w->getName() << std::endl;
+ std::cout << "AP Cost: " << w->getAPCost() << std::endl;
+ std::cout << "Damage: " << w->getDamage() << std::endl;
+ w->attack();
+ }
+
+ std::cout << std::endl;
+
+ {
+ std::cout << "================ POWER FIST =====================" << std::endl;
+ PowerFist pf;
+ PowerFist pf2(pf);
+ PowerFist pf3;
+ pf3 = pf2;
+ std::cout << "Name: " << pf.getName() << std::endl;
+ std::cout << "AP Cost: " << pf.getAPCost() << std::endl;
+ std::cout << "Damage: " << pf.getDamage() << std::endl;
+ pf.attack();
+ pf2.attack();
+ pf3.attack();
+ std::cout << "################ VIRTUAL" << std::endl;
+ AWeapon *w = &pf;
+ std::cout << "Name: " << w->getName() << std::endl;
+ std::cout << "AP Cost: " << w->getAPCost() << std::endl;
+ std::cout << "Damage: " << w->getDamage() << std::endl;
+ w->attack();
+ }
+
+ std::cout << std::endl;
+
+ {
+ std::cout << "================ ENEMY =====================" << std::endl;
+ Enemy e(2000, "Titan");
+ Enemy e2(e);
+ Enemy e3(0, "should not be printed");
+ e3 = e2;
+ std::cout << "Type: " << e.getType() << ", HP: " << e.getHP() << std::endl;
+ std::cout << "Type: " << e2.getType() << ", HP: " << e2.getHP() << std::endl;
+ std::cout << "Type: " << e3.getType() << ", HP: " << e3.getHP() << std::endl;
+ std::cout << "################ TAKE DAMAGE" << std::endl;
+ std::cout << "HP: " << e.getHP() << std::endl;
+ e.takeDamage(10);
+ std::cout << "HP: " << e.getHP() << std::endl;
+ e.takeDamage(-1);
+ std::cout << "HP: " << e.getHP() << std::endl;
+ e.takeDamage(INT_MIN);
+ std::cout << "HP: " << e.getHP() << std::endl;
+ e.takeDamage(0);
+ std::cout << "HP: " << e.getHP() << std::endl;
+ e.takeDamage(3000);
+ std::cout << "HP: " << e.getHP() << std::endl;
+ }
+
+ std::cout << std::endl;
+
+ {
+ std::cout << "================ SUPER MUTANT ====================" << std::endl;
+ SuperMutant m;
+ SuperMutant m2(m);
+ SuperMutant m3;
+ m3 = m2;
+ std::cout << "Type: " << m.getType() << ", HP: " << m.getHP() << std::endl;
+ std::cout << "Type: " << m2.getType() << ", HP: " << m2.getHP() << std::endl;
+ std::cout << "Type: " << m3.getType() << ", HP: " << m3.getHP() << std::endl;
+ std::cout << "################ TAKE DAMAGE" << std::endl;
+ std::cout << "HP: " << m.getHP() << std::endl;
+ m.takeDamage(10);
+ std::cout << "HP: " << m.getHP() << std::endl;
+ m.takeDamage(-1);
+ std::cout << "HP: " << m.getHP() << std::endl;
+ m.takeDamage(INT_MIN);
+ std::cout << "HP: " << m.getHP() << std::endl;
+ m.takeDamage(0);
+ std::cout << "HP: " << m.getHP() << std::endl;
+ m.takeDamage(180);
+ std::cout << "HP: " << m.getHP() << std::endl;
+ }
+
+ std::cout << std::endl;
+
+ {
+ std::cout << "================ RAD SCORPION ====================" << std::endl;
+ RadScorpion s;
+ RadScorpion s2(s);
+ RadScorpion s3;
+ s3 = s2;
+ std::cout << "Type: " << s.getType() << ", HP: " << s.getHP() << std::endl;
+ std::cout << "Type: " << s2.getType() << ", HP: " << s2.getHP() << std::endl;
+ std::cout << "Type: " << s3.getType() << ", HP: " << s3.getHP() << std::endl;
+ std::cout << "################ TAKE DAMAGE" << std::endl;
+ std::cout << "HP: " << s.getHP() << std::endl;
+ s.takeDamage(10);
+ std::cout << "HP: " << s.getHP() << std::endl;
+ s.takeDamage(-1);
+ std::cout << "HP: " << s.getHP() << std::endl;
+ s.takeDamage(INT_MIN);
+ std::cout << "HP: " << s.getHP() << std::endl;
+ s.takeDamage(0);
+ std::cout << "HP: " << s.getHP() << std::endl;
+ s.takeDamage(90);
+ std::cout << "HP: " << s.getHP() << std::endl;
+ }
+
+ std::cout << std::endl;
+
+ {
+ std::cout << "================ CHARACTER ====================" << std::endl;
+ Character c("Jean-Didier");
+ Character c2(c);
+ Character c3("should not be displayed");
+ c3 = c2;
+ std::cout << c;
+ std::cout << c2;
+ std::cout << c3;
+
+ std::cout << "################ ATTACK NO WEAPON" << std::endl;
+ Enemy* r = new RadScorpion();
+ c.attack(r);
+ Enemy* s = new SuperMutant();
+ c.attack(s);
+
+ std::cout << "################ EQUIP" << std::endl;
+ PowerFist pf;
+ c.equip(&pf);
+ c.attack(r);
+ c.attack(s);
+ std::cout << c;
+ PlasmaRifle pr;
+ c.equip(&pr);
+ c.attack(r);
+ c.attack(s);
+ std::cout << c;
+ c.attack(s);
+ c.attack(s);
+ c.attack(s);
+ c.recoverAP();
+ c.recoverAP();
+ c.attack(s);
+ c.attack(s);
+ c.attack(s);
+ c.attack(s);
+ c.attack(s);
+
+ std::cout << "################ RECOVER AP" << std::endl;
+ std::cout << c;
+ c.recoverAP();
+ std::cout << c;
+ c.recoverAP();
+ std::cout << c;
+ c.recoverAP();
+ std::cout << c;
+ c.recoverAP();
+ std::cout << c;
+ c.recoverAP();
+ std::cout << c;
+ c.attack(r);
+ // std::cout << "################ DESTRUCTORS" << std::endl;
}
return 0;
diff --git a/cpp04/ex02/AssaultTerminator.cpp b/cpp04/ex02/AssaultTerminator.cpp
index c00a00c..a62c9e4 100644
--- a/cpp04/ex02/AssaultTerminator.cpp
+++ b/cpp04/ex02/AssaultTerminator.cpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 15:47:06 by charles #+# #+# */
-/* Updated: 2020/11/12 15:37:48 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 12:19:15 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -17,7 +17,11 @@ AssaultTerminator::AssaultTerminator()
std::cout << "* teleports from space *" << std::endl;
}
-AssaultTerminator::AssaultTerminator(AssaultTerminator const& other) { *this = other; }
+AssaultTerminator::AssaultTerminator(AssaultTerminator const& other)
+{
+ std::cout << "* teleports from space *" << std::endl;
+ *this = other;
+}
AssaultTerminator& AssaultTerminator::operator=(AssaultTerminator const& other)
{
@@ -32,8 +36,7 @@ AssaultTerminator::~AssaultTerminator()
ISpaceMarine* AssaultTerminator::clone() const
{
- ISpaceMarine* cloned = new AssaultTerminator();
- *cloned = *this;
+ ISpaceMarine* cloned = new AssaultTerminator(*this);
return cloned;
}
diff --git a/cpp04/ex02/AssaultTerminator.hpp b/cpp04/ex02/AssaultTerminator.hpp
index b2064f1..e1ac9f1 100644
--- a/cpp04/ex02/AssaultTerminator.hpp
+++ b/cpp04/ex02/AssaultTerminator.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 15:46:20 by charles #+# #+# */
-/* Updated: 2020/11/12 15:36:54 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 12:18:55 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -24,10 +24,10 @@ public:
AssaultTerminator& operator=(AssaultTerminator const& other);
virtual ~AssaultTerminator();
- virtual ISpaceMarine* clone() const;
- virtual void battleCry() const;
- virtual void rangedAttack() const;
- virtual void meleeAttack() const;
+ virtual ISpaceMarine* clone() const;
+ virtual void battleCry() const;
+ virtual void rangedAttack() const;
+ virtual void meleeAttack() const;
private:
};
diff --git a/cpp04/ex02/Squad.cpp b/cpp04/ex02/Squad.cpp
index d1d988f..1cc59f0 100644
--- a/cpp04/ex02/Squad.cpp
+++ b/cpp04/ex02/Squad.cpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 15:08:35 by charles #+# #+# */
-/* Updated: 2020/11/12 15:38:55 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 12:13:57 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -14,12 +14,12 @@
Squad::Squad() : m_units(new ISpaceMarine*[0]), m_size(0) {}
-Squad::Squad(Squad const& other) { *this = other; }
+Squad::Squad(Squad const& other) : m_units(NULL), m_size(0) { *this = other; }
Squad& Squad::operator=(Squad const& other)
{
destroyUnits();
- m_size = other.m_size;
+ m_size = other.m_size;
m_units = new ISpaceMarine*[m_size];
for (int i = 0; i < m_size; i++)
m_units[i] = other.m_units[i]->clone();
@@ -57,6 +57,8 @@ int Squad::push(ISpaceMarine* spaceMarine)
void Squad::destroyUnits()
{
+ if (m_units == NULL)
+ return;
for (int i = 0; i < m_size; i++)
delete m_units[i];
delete [] m_units;
diff --git a/cpp04/ex02/Squad.hpp b/cpp04/ex02/Squad.hpp
index 9ea5268..48e53cd 100644
--- a/cpp04/ex02/Squad.hpp
+++ b/cpp04/ex02/Squad.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 15:07:57 by charles #+# #+# */
-/* Updated: 2020/11/12 15:39:26 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 12:06:51 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -25,15 +25,15 @@ public:
Squad& operator=(Squad const& other);
virtual ~Squad();
- virtual int getCount() const;
- virtual ISpaceMarine* getUnit(int n) const;
- virtual int push(ISpaceMarine* spaceMarine);
+ virtual int getCount() const;
+ virtual ISpaceMarine* getUnit(int n) const;
+ virtual int push(ISpaceMarine* spaceMarine);
private:
void destroyUnits();
ISpaceMarine** m_units;
- int m_size;
+ int m_size;
};
#endif
diff --git a/cpp04/ex02/TacticalMarine.cpp b/cpp04/ex02/TacticalMarine.cpp
index df771e8..cf30d2a 100644
--- a/cpp04/ex02/TacticalMarine.cpp
+++ b/cpp04/ex02/TacticalMarine.cpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 15:31:43 by charles #+# #+# */
-/* Updated: 2020/11/12 15:37:41 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 12:18:14 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -17,7 +17,11 @@ TacticalMarine::TacticalMarine()
std::cout << "Tactical Marine ready for battle!" << std::endl;
}
-TacticalMarine::TacticalMarine(TacticalMarine const& other) { *this = other; }
+TacticalMarine::TacticalMarine(TacticalMarine const& other)
+{
+ std::cout << "Tactical Marine ready for battle!" << std::endl;
+ *this = other;
+}
TacticalMarine& TacticalMarine::operator=(TacticalMarine const& other)
{
@@ -32,8 +36,7 @@ TacticalMarine::~TacticalMarine()
ISpaceMarine* TacticalMarine::clone() const
{
- ISpaceMarine* cloned = new TacticalMarine();
- *cloned = *this;
+ ISpaceMarine* cloned = new TacticalMarine(*this);
return cloned;
}
diff --git a/cpp04/ex02/TacticalMarine.hpp b/cpp04/ex02/TacticalMarine.hpp
index 43722d6..965cb30 100644
--- a/cpp04/ex02/TacticalMarine.hpp
+++ b/cpp04/ex02/TacticalMarine.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 15:30:48 by charles #+# #+# */
-/* Updated: 2020/11/12 15:38:03 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 12:16:07 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -24,10 +24,10 @@ public:
TacticalMarine& operator=(TacticalMarine const& other);
virtual ~TacticalMarine();
- virtual ISpaceMarine* clone() const;
- virtual void battleCry() const;
- virtual void rangedAttack() const;
- virtual void meleeAttack() const;
+ virtual ISpaceMarine* clone() const;
+ virtual void battleCry() const;
+ virtual void rangedAttack() const;
+ virtual void meleeAttack() const;
private:
};
diff --git a/cpp04/ex02/main.cpp b/cpp04/ex02/main.cpp
index 137ce46..c53dadb 100644
--- a/cpp04/ex02/main.cpp
+++ b/cpp04/ex02/main.cpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 15:50:35 by charles #+# #+# */
-/* Updated: 2020/04/14 15:53:35 by charles ### ########.fr */
+/* Updated: 2020/11/13 12:36:22 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -18,20 +18,112 @@
int main()
{
- ISpaceMarine* bob = new TacticalMarine;
- ISpaceMarine* jim = new AssaultTerminator;
+ {
+ std::cout << "================ SUBJECT MAIN =====================" << std::endl;
+ ISpaceMarine* bob = new TacticalMarine;
+ ISpaceMarine* jim = new AssaultTerminator;
+
+ ISquad* vlc = new Squad;
+ vlc->push(bob);
+ vlc->push(jim);
+ for (int i = 0; i < vlc->getCount(); ++i)
+ {
+ ISpaceMarine* cur = vlc->getUnit(i);
+ cur->battleCry();
+ cur->rangedAttack();
+ cur->meleeAttack();
+ }
+ delete vlc;
+ }
+
+ std::cout << std::endl;
+
+ {
+ std::cout << "================ TACTICAL MARINE =====================" << std::endl;
+ TacticalMarine t;
+ t.battleCry();
+ t.rangedAttack();
+ t.meleeAttack();
+ TacticalMarine t2(t);
+ TacticalMarine t3;
+ t3 = t;
+ std::cout << "################ INTERFACE" << std::endl;
+ ISpaceMarine *sm = new TacticalMarine();
+ sm->battleCry();
+ sm->rangedAttack();
+ sm->meleeAttack();
+ delete sm;
+ }
+
+ std::cout << std::endl;
- ISquad* vlc = new Squad;
- vlc->push(bob);
- vlc->push(jim);
- for (int i = 0; i < vlc->getCount(); ++i)
{
- ISpaceMarine* cur = vlc->getUnit(i);
- cur->battleCry();
- cur->rangedAttack();
- cur->meleeAttack();
+ std::cout << "================ ASSAULT TERMINATOR =====================" << std::endl;
+ AssaultTerminator a;
+ a.battleCry();
+ a.rangedAttack();
+ a.meleeAttack();
+ AssaultTerminator a2(a);
+ AssaultTerminator a3;
+ a3 = a;
+ std::cout << "################ INTERFACE" << std::endl;
+ ISpaceMarine *sm = new AssaultTerminator();
+ sm->battleCry();
+ sm->rangedAttack();
+ sm->meleeAttack();
+ delete sm;
+ }
+
+ std::cout << std::endl;
+
+ {
+ std::cout << "================ SQUAD =====================" << std::endl;
+ Squad s;
+ std::cout << "Count: " << s.getCount() << std::endl;
+ s.push(new TacticalMarine());
+ std::cout << "Count: " << s.getCount() << std::endl;
+ s.push(new TacticalMarine());
+ s.push(new AssaultTerminator());
+ s.push(new AssaultTerminator());
+ std::cout << "Count: " << s.getCount() << std::endl;
+ s.getUnit(0)->battleCry();
+ s.getUnit(1)->battleCry();
+ s.getUnit(2)->battleCry();
+ s.getUnit(3)->battleCry();
+ s.getUnit(3)->rangedAttack();
+ s.getUnit(3)->meleeAttack();
+ s.getUnit(0)->rangedAttack();
+ s.getUnit(0)->meleeAttack();
+ std::cout << s.getUnit(4) << std::endl;
+ std::cout << s.getUnit(-1) << std::endl;
+
+ std::cout << "################ COPY" << std::endl;
+ Squad s2(s);
+ std::cout << "Copy Count: " << s2.getCount() << std::endl;
+ s2.push(new TacticalMarine());
+ std::cout << "Copy Count: " << s2.getCount() << std::endl;
+ std::cout << "Origin Count: " << s.getCount() << std::endl;
+
+ std::cout << "################ ASSIGN" << std::endl;
+ Squad s3;
+ s3 = s;
+ std::cout << "Copy Count: " << s3.getCount() << std::endl;
+ s3.push(new TacticalMarine());
+ std::cout << "Copy Count: " << s3.getCount() << std::endl;
+ std::cout << "Origin Count: " << s.getCount() << std::endl;
+
+ std::cout << "################ INTERFACE" << std::endl;
+ ISquad *si = new Squad();
+ si->push(new TacticalMarine());
+ std::cout << si->getCount() << std::endl;
+ si->getUnit(0)->battleCry();
+ si->push(new AssaultTerminator());
+ std::cout << si->getCount() << std::endl;
+ si->getUnit(1)->battleCry();
+ delete si;
+
+ std::cout << "################ DESTROY" << std::endl;
}
- delete vlc;
return 0;
}
diff --git a/cpp04/ex03/AMateria.cpp b/cpp04/ex03/AMateria.cpp
index 1dc7ca9..b08c4f2 100644
--- a/cpp04/ex03/AMateria.cpp
+++ b/cpp04/ex03/AMateria.cpp
@@ -6,21 +6,21 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 16:26:57 by charles #+# #+# */
-/* Updated: 2020/11/12 15:40:23 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:26:28 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "AMateria.hpp"
-AMateria::AMateria(AMateria const& other)
+AMateria::AMateria(AMateria const& other) : m_type(other.m_type)
{
*this = other;
- m_type = "";
}
AMateria& AMateria::operator=(AMateria const& other)
{
- _xp = other._xp;
+ _xp = other._xp;
+ // subject doesn't want type to be copied
return *this;
}
@@ -28,13 +28,13 @@ AMateria::~AMateria() {}
AMateria::AMateria(std::string const& type) : m_type(type), _xp(0) {}
-std::string const& AMateria::getType() const
+std::string const& AMateria::getType() const { return m_type; }
+unsigned int AMateria::getXP() const { return _xp; }
+
+void AMateria::use(ICharacter& target)
{
- return m_type;
+ (void)target;
+ _xp += 10;
}
-unsigned int AMateria::getXP() const { return _xp; }
-
-void AMateria::use(ICharacter& target) { _xp += 10; }
-
AMateria::AMateria() {}
diff --git a/cpp04/ex03/AMateria.hpp b/cpp04/ex03/AMateria.hpp
index 7fef1c8..41ef132 100644
--- a/cpp04/ex03/AMateria.hpp
+++ b/cpp04/ex03/AMateria.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 16:24:00 by charles #+# #+# */
-/* Updated: 2020/11/12 15:41:54 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:42:03 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -26,17 +26,18 @@ public:
virtual ~AMateria();
AMateria(std::string const& type);
+
std::string const& getType() const;
- unsigned int getXP() const;
+ unsigned int getXP() const;
virtual AMateria* clone() const = 0;
- virtual void use(ICharacter& target);
+ virtual void use(ICharacter& target);
protected:
AMateria();
- std::string m_type;
- unsigned int _xp; // subject force _xp instead of m_xp
+ std::string m_type;
+ unsigned int _xp; // subject force _xp
};
#endif
diff --git a/cpp04/ex03/Character.cpp b/cpp04/ex03/Character.cpp
index ee03e63..d159aaf 100644
--- a/cpp04/ex03/Character.cpp
+++ b/cpp04/ex03/Character.cpp
@@ -6,20 +6,18 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 16:45:54 by charles #+# #+# */
-/* Updated: 2020/11/12 15:43:14 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:20:50 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "Character.hpp"
-Character::Character() : m_name(""), m_inventory_size(0) {}
-
-Character::Character(Character const& other) { *this = other; }
+Character::Character(Character const& other)
+ : m_inventory_size(0) { *this = other; }
Character& Character::operator=(Character const& other)
{
- for (int i = 0; i < m_inventory_size; i++)
- delete m_inventory[i];
+ destroyInventory();
m_inventory_size = other.m_inventory_size;
for (int i = 0; i < m_inventory_size; i++)
m_inventory[i] = other.m_inventory[i]->clone();
@@ -27,11 +25,7 @@ Character& Character::operator=(Character const& other)
return *this;
}
-Character::~Character()
-{
- for (int i = 0; i < m_inventory_size; i++)
- delete m_inventory[i];
-}
+Character::~Character() { destroyInventory(); }
Character::Character(std::string const& name) : m_name(name), m_inventory_size(0) {}
@@ -60,3 +54,11 @@ void Character::use(int idx, ICharacter& target)
return;
m_inventory[idx]->use(target);
}
+
+void Character::destroyInventory()
+{
+ for (int i = 0; i < m_inventory_size; i++)
+ delete m_inventory[i];
+}
+
+Character::Character() {}
diff --git a/cpp04/ex03/Character.hpp b/cpp04/ex03/Character.hpp
index 6526ba2..5a27d2c 100644
--- a/cpp04/ex03/Character.hpp
+++ b/cpp04/ex03/Character.hpp
@@ -6,13 +6,14 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 16:44:43 by charles #+# #+# */
-/* Updated: 2020/11/12 15:42:43 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:17:54 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef CHARACTER_HPP
# define CHARACTER_HPP
+# include <string>
# include "ICharacter.hpp"
# define INVENTORY_MAX_SIZE 4
@@ -20,7 +21,6 @@
class Character : public ICharacter
{
public:
- Character();
Character(Character const& other);
Character& operator=(Character const& other);
virtual ~Character();
@@ -35,6 +35,10 @@ private:
AMateria* m_inventory[INVENTORY_MAX_SIZE];
int m_inventory_size;
std::string m_name;
+
+ void destroyInventory();
+
+ Character();
};
#endif
diff --git a/cpp04/ex03/Cure.cpp b/cpp04/ex03/Cure.cpp
index e27ae26..dc464ff 100644
--- a/cpp04/ex03/Cure.cpp
+++ b/cpp04/ex03/Cure.cpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 17:38:01 by charles #+# #+# */
-/* Updated: 2020/11/12 15:43:44 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:09:58 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -29,4 +29,5 @@ AMateria* Cure::clone() const { return new Cure(*this); }
void Cure::use(ICharacter& target)
{
std::cout << "* heals " << target.getName() << "'s wounds *" << std::endl;
+ AMateria::use(target);
}
diff --git a/cpp04/ex03/Cure.hpp b/cpp04/ex03/Cure.hpp
index ccc86d5..71647ff 100644
--- a/cpp04/ex03/Cure.hpp
+++ b/cpp04/ex03/Cure.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 17:37:11 by charles #+# #+# */
-/* Updated: 2020/11/12 15:43:24 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:09:18 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -25,7 +25,7 @@ public:
~Cure();
virtual AMateria* clone() const;
- virtual void use(ICharacter& target);
+ virtual void use(ICharacter& target);
private:
};
diff --git a/cpp04/ex03/ICharacter.hpp b/cpp04/ex03/ICharacter.hpp
index bb84d7e..786be6a 100644
--- a/cpp04/ex03/ICharacter.hpp
+++ b/cpp04/ex03/ICharacter.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 16:40:25 by charles #+# #+# */
-/* Updated: 2020/11/12 15:42:12 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:27:47 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -16,7 +16,7 @@
# include <string>
# include "AMateria.hpp"
-class IMateria;
+class AMateria;
class ICharacter
{
@@ -26,11 +26,6 @@ public:
virtual void equip(AMateria* m) = 0;
virtual void unequip(int idx) = 0;
virtual void use(int idx, ICharacter& target) = 0;
-
-protected:
- ICharacter();
- ICharacter(ICharacter const& other);
- ICharacter& operator=(ICharacter const& other);
};
#endif
diff --git a/cpp04/ex03/IMateriaSource.hpp b/cpp04/ex03/IMateriaSource.hpp
index 5161604..63b5f01 100644
--- a/cpp04/ex03/IMateriaSource.hpp
+++ b/cpp04/ex03/IMateriaSource.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 17:15:52 by charles #+# #+# */
-/* Updated: 2020/04/14 17:21:54 by charles ### ########.fr */
+/* Updated: 2020/11/13 14:23:42 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
diff --git a/cpp04/ex03/Ice.cpp b/cpp04/ex03/Ice.cpp
index c663104..9df83b2 100644
--- a/cpp04/ex03/Ice.cpp
+++ b/cpp04/ex03/Ice.cpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 16:32:27 by charles #+# #+# */
-/* Updated: 2020/11/12 15:44:48 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:06:33 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -14,7 +14,7 @@
Ice::Ice() : AMateria("ice") {}
-Ice::Ice(Ice const& other) { *this = other; }
+Ice::Ice(Ice const& other) : AMateria(other) {}
Ice& Ice::operator=(Ice const& other)
{
diff --git a/cpp04/ex03/Ice.hpp b/cpp04/ex03/Ice.hpp
index 8b670f6..41f07de 100644
--- a/cpp04/ex03/Ice.hpp
+++ b/cpp04/ex03/Ice.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 16:31:34 by charles #+# #+# */
-/* Updated: 2020/11/12 15:44:31 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:09:24 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -25,7 +25,7 @@ public:
~Ice();
virtual AMateria* clone() const;
- virtual void use(ICharacter& target);
+ virtual void use(ICharacter& target);
private:
};
diff --git a/cpp04/ex03/MateriaSource.cpp b/cpp04/ex03/MateriaSource.cpp
index 087af3e..774506b 100644
--- a/cpp04/ex03/MateriaSource.cpp
+++ b/cpp04/ex03/MateriaSource.cpp
@@ -6,28 +6,46 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 17:19:10 by charles #+# #+# */
-/* Updated: 2020/11/12 15:45:23 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:40:54 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "MateriaSource.hpp"
-MateriaSource::MateriaSource() {}
+MateriaSource::MateriaSource() : m_learned_size(0) {}
-MateriaSource::MateriaSource(MateriaSource const& other) { *this = other; }
+MateriaSource::MateriaSource(MateriaSource const& other)
+ : m_learned_size(0) { *this = other; }
-void MateriaSource::operator=(MateriaSource const& other)
+MateriaSource& MateriaSource::operator=(MateriaSource const& other)
{
+ destroyLearned();
+ m_learned_size = other.m_learned_size;
+ for (int i = 0; i < m_learned_size; i++)
+ m_learned[i] = other.m_learned[i]->clone();
return *this;
}
-MateriaSource::~MateriaSource() {}
+MateriaSource::~MateriaSource() { destroyLearned(); }
void MateriaSource::learnMateria(AMateria* materia)
{
+ if (m_learned_size >= 4)
+ return;
+ m_learned[m_learned_size] = materia->clone();
+ m_learned_size++;
}
AMateria* MateriaSource::createMateria(std::string const& type)
{
+ for (int i = 0; i < m_learned_size; i++)
+ if (m_learned[i]->getType() == type)
+ return m_learned[i]->clone();
return NULL;
}
+
+void MateriaSource::destroyLearned()
+{
+ for (int i = 0; i < m_learned_size; i++)
+ delete m_learned[i];
+}
diff --git a/cpp04/ex03/MateriaSource.hpp b/cpp04/ex03/MateriaSource.hpp
index eb233eb..51f0a7e 100644
--- a/cpp04/ex03/MateriaSource.hpp
+++ b/cpp04/ex03/MateriaSource.hpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 17:17:40 by charles #+# #+# */
-/* Updated: 2020/11/12 15:45:28 by cacharle ### ########.fr */
+/* Updated: 2020/11/13 14:41:04 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -25,12 +25,14 @@ public:
MateriaSource& operator=(MateriaSource const& other);
virtual ~MateriaSource();
- virtual void learnMateria(AMateria* materia);
+ virtual void learnMateria(AMateria* materia);
virtual AMateria* createMateria(std::string const& type);
private:
AMateria* m_learned[LEARNED_MAX_SIZE];
- int m_learned_size;
+ int m_learned_size;
+
+ void destroyLearned();
};
#endif
diff --git a/cpp04/ex03/main.cpp b/cpp04/ex03/main.cpp
index 11f471f..871007d 100644
--- a/cpp04/ex03/main.cpp
+++ b/cpp04/ex03/main.cpp
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/14 17:58:01 by charles #+# #+# */
-/* Updated: 2020/04/14 17:59:02 by charles ### ########.fr */
+/* Updated: 2020/11/13 14:41:49 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
diff --git a/subjects/cpp04.en.pdf b/subjects/cpp04.en.pdf
index 4d789a3..e4b7d6b 100644
--- a/subjects/cpp04.en.pdf
+++ b/subjects/cpp04.en.pdf
Binary files differ