From cb2e50456928ad209a7f37ab43defabf1f2834d5 Mon Sep 17 00:00:00 2001 From: Lukas Jiriste Date: Wed, 22 Jan 2025 14:12:58 +0100 Subject: [PATCH] Implement ex02 --- ex02/A.cpp | 5 ++++ ex02/A.h | 12 ++++++++++ ex02/B.cpp | 5 ++++ ex02/B.h | 12 ++++++++++ ex02/Base.cpp | 5 ++++ ex02/Base.h | 13 +++++++++++ ex02/C.cpp | 5 ++++ ex02/C.h | 12 ++++++++++ ex02/Makefile | 56 ++++++++++++++++++++++++++++++++++++++++++++ ex02/main.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 190 insertions(+) create mode 100644 ex02/A.cpp create mode 100644 ex02/A.h create mode 100644 ex02/B.cpp create mode 100644 ex02/B.h create mode 100644 ex02/Base.cpp create mode 100644 ex02/Base.h create mode 100644 ex02/C.cpp create mode 100644 ex02/C.h create mode 100644 ex02/Makefile create mode 100644 ex02/main.cpp diff --git a/ex02/A.cpp b/ex02/A.cpp new file mode 100644 index 0000000..f21f79f --- /dev/null +++ b/ex02/A.cpp @@ -0,0 +1,5 @@ +#include "A.h" + +A::~A() +{ +} diff --git a/ex02/A.h b/ex02/A.h new file mode 100644 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 index 0000000..a3cd512 --- /dev/null +++ b/ex02/B.cpp @@ -0,0 +1,5 @@ +#include "B.h" + +B::~B() +{ +} diff --git a/ex02/B.h b/ex02/B.h new file mode 100644 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 index 0000000..d9b0b86 --- /dev/null +++ b/ex02/Base.cpp @@ -0,0 +1,5 @@ +#include "Base.h" + +Base::~Base() +{ +} diff --git a/ex02/Base.h b/ex02/Base.h new file mode 100644 index 0000000..13ee051 --- /dev/null +++ b/ex02/Base.h @@ -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 index 0000000..0512b40 --- /dev/null +++ b/ex02/C.cpp @@ -0,0 +1,5 @@ +#include "C.h" + +C::~C() +{ +} diff --git a/ex02/C.h b/ex02/C.h new file mode 100644 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 index 0000000..7a3fa68 --- /dev/null +++ b/ex02/Makefile @@ -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 index 0000000..b464b29 --- /dev/null +++ b/ex02/main.cpp @@ -0,0 +1,65 @@ +#include "Base.h" +#include "A.h" +#include "B.h" +#include "C.h" +#include +#include +#include + +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(p)) + std::cout << "The pointer is to class A\n"; + else if (dynamic_cast(p)) + std::cout << "The pointer is to class B\n"; + else if (dynamic_cast(p)) + std::cout << "The pointer is to class C\n"; +} + +void identify(Base &r) +{ + Base *const p = &r; + + if (dynamic_cast(p)) + std::cout << "The reference is to class A\n"; + else if (dynamic_cast(p)) + std::cout << "The reference is to class B\n"; + else if (dynamic_cast(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); +} -- 2.30.2