Implement ex02 trunk
authorLukas Jiriste <ljiriste@student.42prague.com>
Wed, 22 Jan 2025 13:12:58 +0000 (14:12 +0100)
committerLukas Jiriste <ljiriste@student.42prague.com>
Wed, 22 Jan 2025 13:12:58 +0000 (14:12 +0100)
ex02/A.cpp [new file with mode: 0644]
ex02/A.h [new file with mode: 0644]
ex02/B.cpp [new file with mode: 0644]
ex02/B.h [new file with mode: 0644]
ex02/Base.cpp [new file with mode: 0644]
ex02/Base.h [new file with mode: 0644]
ex02/C.cpp [new file with mode: 0644]
ex02/C.h [new file with mode: 0644]
ex02/Makefile [new file with mode: 0644]
ex02/main.cpp [new file with mode: 0644]

diff --git a/ex02/A.cpp b/ex02/A.cpp
new file mode 100644 (file)
index 0000000..f21f79f
--- /dev/null
@@ -0,0 +1,5 @@
+#include "A.h"
+
+A::~A()
+{
+}
diff --git a/ex02/A.h b/ex02/A.h
new file mode 100644 (file)
index 0000000..5e2e99b
--- /dev/null
+++ b/ex02/A.h
@@ -0,0 +1,12 @@
+#ifndef A_H
+# define A_H
+
+# include "Base.h"
+
+class A : public Base
+{
+       public:
+               ~A();
+};
+
+#endif // A_H
diff --git a/ex02/B.cpp b/ex02/B.cpp
new file mode 100644 (file)
index 0000000..a3cd512
--- /dev/null
@@ -0,0 +1,5 @@
+#include "B.h"
+
+B::~B()
+{
+}
diff --git a/ex02/B.h b/ex02/B.h
new file mode 100644 (file)
index 0000000..069f427
--- /dev/null
+++ b/ex02/B.h
@@ -0,0 +1,12 @@
+#ifndef B_H
+# define B_H
+
+# include "Base.h"
+
+class B : public Base
+{
+       public:
+               ~B();
+};
+
+#endif // B_H
diff --git a/ex02/Base.cpp b/ex02/Base.cpp
new file mode 100644 (file)
index 0000000..d9b0b86
--- /dev/null
@@ -0,0 +1,5 @@
+#include "Base.h"
+
+Base::~Base()
+{
+}
diff --git a/ex02/Base.h b/ex02/Base.h
new file mode 100644 (file)
index 0000000..13ee051
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef BASE_H
+# define BASE_H
+
+class Base
+{
+       private:
+
+       public:
+               virtual ~Base();
+};
+
+#endif // BASE_H
+
diff --git a/ex02/C.cpp b/ex02/C.cpp
new file mode 100644 (file)
index 0000000..0512b40
--- /dev/null
@@ -0,0 +1,5 @@
+#include "C.h"
+
+C::~C()
+{
+}
diff --git a/ex02/C.h b/ex02/C.h
new file mode 100644 (file)
index 0000000..efeddae
--- /dev/null
+++ b/ex02/C.h
@@ -0,0 +1,12 @@
+#ifndef C_H
+# define C_H
+
+# include "Base.h"
+
+class C : public Base
+{
+       public:
+               ~C();
+};
+
+#endif // C_H
diff --git a/ex02/Makefile b/ex02/Makefile
new file mode 100644 (file)
index 0000000..7a3fa68
--- /dev/null
@@ -0,0 +1,56 @@
+CC := c++
+CFLAGS = -std=c++98 -Wall -Wextra -Werror -Wpedantic
+
+ifneq ("$(wildcard .debug)","")
+       CFLAGS += -g
+endif
+
+RM := rm -f
+
+INCDIR := inc
+INCDIR += $(addsuffix /inc, $(SUBPROJECTS));
+ifneq ($(INCLUDE),)
+       INCLUDE := $(addprefix -I, $(INCDIR))
+endif
+
+SRCDIR := .
+
+SOURCES :=     main.cpp                        \
+                       Base.cpp                        \
+                       A.cpp                           \
+                       B.cpp                           \
+                       C.cpp                           \
+
+SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES))
+
+OBJECTS := $(SOURCES:.cpp=.o)
+
+NAME := dynacast
+
+all : $(NAME)
+
+debug : .debug
+       $(MAKE) all
+
+nodebug :
+       $(RM) .debug
+       $(MAKE) re
+
+.% :
+       $(MAKE) fclean
+       touch $@
+
+$(NAME) : $(OBJECTS)
+       $(CC) $(CFLAGS) -o $@ $^ $(LINKS)
+
+%.o : %.cpp
+       $(CC) $(CFLAGS) -o $@ -c $< $(INCLUDE)
+
+clean :
+       $(RM) $(OBJECTS)
+
+fclean : clean
+       $(RM) $(NAME)
+
+re : fclean
+       $(MAKE) all
diff --git a/ex02/main.cpp b/ex02/main.cpp
new file mode 100644 (file)
index 0000000..b464b29
--- /dev/null
@@ -0,0 +1,65 @@
+#include "Base.h"
+#include "A.h"
+#include "B.h"
+#include "C.h"
+#include <iostream>
+#include <cstdlib>
+#include <ctime>
+
+Base   *generate(void)
+{
+       static bool     is_seeded = 0;
+
+       if (!is_seeded)
+       {
+               std::srand(std::time(0));
+               is_seeded = 1;
+       }
+       switch (std::rand() % 3)
+       {
+               case 0:
+                       return (new (A));
+               case 1:
+                       return (new (B));
+               case 2:
+                       return (new (C));
+       }
+       return (NULL);
+}
+
+void   identify(Base *p)
+{
+       if (dynamic_cast<A*>(p))
+               std::cout << "The pointer is to class A\n";
+       else if (dynamic_cast<B*>(p))
+               std::cout << "The pointer is to class B\n";
+       else if (dynamic_cast<C*>(p))
+               std::cout << "The pointer is to class C\n";
+}
+
+void   identify(Base &r)
+{
+       Base *const     p = &r;
+
+       if (dynamic_cast<A*>(p))
+               std::cout << "The reference is to class A\n";
+       else if (dynamic_cast<B*>(p))
+               std::cout << "The reference is to class B\n";
+       else if (dynamic_cast<C*>(p))
+               std::cout << "The reference is to class C\n";
+}
+
+int    main(void)
+{
+       Base    *p;
+
+       for (size_t i(0); i < 10; ++i)
+       {
+               p = generate();
+               identify(p);
+               identify(*p);
+               std::cout << '\n';
+               delete (p);
+       }
+       return (0);
+}