diff --git a/ex02/A.hpp b/ex02/A.hpp new file mode 100644 index 0000000..8c49b23 --- /dev/null +++ b/ex02/A.hpp @@ -0,0 +1,10 @@ +#ifndef A_HPP +#define A_HPP + +#include "Base.hpp" + +class A: public Base +{ +}; + +#endif \ No newline at end of file diff --git a/ex02/B.hpp b/ex02/B.hpp new file mode 100644 index 0000000..36318b7 --- /dev/null +++ b/ex02/B.hpp @@ -0,0 +1,10 @@ +#ifndef B_HPP +#define B_HPP + +#include "Base.hpp" + +class B: public Base +{ +}; + +#endif \ No newline at end of file diff --git a/ex02/Base.cpp b/ex02/Base.cpp new file mode 100644 index 0000000..84dabbf --- /dev/null +++ b/ex02/Base.cpp @@ -0,0 +1,5 @@ +#include "Base.hpp" + +Base::~Base() +{ +}; \ No newline at end of file diff --git a/ex02/Base.hpp b/ex02/Base.hpp new file mode 100644 index 0000000..e685e1d --- /dev/null +++ b/ex02/Base.hpp @@ -0,0 +1,12 @@ +#ifndef BASE_HPP +#define BASE_HPP + +#include + +class Base +{ + public: + virtual ~Base(); +}; + +#endif \ No newline at end of file diff --git a/ex02/C.hpp b/ex02/C.hpp new file mode 100644 index 0000000..e7a1564 --- /dev/null +++ b/ex02/C.hpp @@ -0,0 +1,10 @@ +#ifndef C_HPP +#define C_HPP + +#include "Base.hpp" + +class C: public Base +{ +}; + +#endif \ No newline at end of file diff --git a/ex02/Main.cpp b/ex02/Main.cpp new file mode 100644 index 0000000..89b04f5 --- /dev/null +++ b/ex02/Main.cpp @@ -0,0 +1,101 @@ +#include "Base.hpp" +#include "A.hpp" +#include "B.hpp" +#include "C.hpp" + +#include +#include + +// static Base *generate(void) +// { +// switch (rand() % 3) +// { +// case 0: +// std::cout << "create A" << std::endl; +// return (new A()); +// break; +// case 1: +// std::cout << "create B" << std::endl; +// return (new B()); +// break; +// case 2: +// std::cout << "create C" << std::endl; +// return (new C()); +// break; +// default: +// std::cerr << "Error" << std::endl; +// return NULL; +// } +// } + +static Base *generate(void) +{ + switch (rand() % 3) + { + case 0: + return (new A()); + break; + case 1: + return (new B()); + break; + case 2: + return (new C()); + break; + default: + std::cerr << "Error" << std::endl; + return NULL; + } +} + +void identify(Base* p) +{ + if (dynamic_cast(p)) + std::cout << "Object is of type A" << std::endl; + else if (dynamic_cast(p)) + std::cout << "Object is of type B" << std::endl; + else if (dynamic_cast(p)) + std::cout << "Object is of type C" << std::endl; +} + +void identify(Base& p) +{ + try { + (void)dynamic_cast(p); + std::cout << "Object is of type A" << std::endl; + return; + } catch (std::exception&) {} + try { + (void)dynamic_cast(p); + std::cout << "Object is of type B" << std::endl; + return; + } catch (std::exception&) {} + try { + (void)dynamic_cast(p); + std::cout << "Object is of type C" << std::endl; + return; + } catch (std::exception&) {} +} + +int main() +{ + Base* ptr; + std::cout << "Test 1 PTR: " << std::endl; + ptr = generate(); + identify(ptr); + delete ptr; + std::cout << "Test 2 PTR: " << std::endl; + ptr = generate(); + identify(ptr); + delete ptr; + ////////////////////////////////// + std::cout << "Test 1 REF: " << std::endl; + ptr = generate(); + identify(*ptr); + delete ptr; + std::cout << "Test 2 REF: " << std::endl; + ptr = generate(); + identify(*ptr); + delete ptr; + + return 0; +} \ No newline at end of file diff --git a/ex02/Makefile b/ex02/Makefile new file mode 100644 index 0000000..3576aa2 --- /dev/null +++ b/ex02/Makefile @@ -0,0 +1,36 @@ +CXX = c++ +CXXFLAGS = -Wall -Wextra -Werror -std=c++98 +OBJDIR = obj +SOURCES = Main.cpp Base.cpp +OBJECTS = $(addprefix $(OBJDIR)/, $(SOURCES:.cpp=.o)) +NAME = Identify + +all: $(NAME) + +$(OBJDIR): + @echo "๐Ÿ“ Creating obj directory..." + @mkdir -p $(OBJDIR) + +$(OBJDIR)/%.o: %.cpp | $(OBJDIR) + @echo "๐Ÿง  Compiling $< ..." + @$(CXX) $(CXXFLAGS) -c $< -o $@ + @echo "โœ… $@ ready!" + +$(NAME): $(OBJECTS) + @echo "๐Ÿ”— Linking $(NAME) ..." + @$(CXX) $(CXXFLAGS) $(OBJECTS) -o $(NAME) + @echo "๐ŸŽ‰ $(NAME) is ready!" + +clean: + @echo "๐Ÿงน Cleaning object files..." + @rm -rf $(OBJDIR) + @echo "โœจ Objects cleaned!" + +fclean: clean + @echo "๐Ÿ—‘๏ธ Removing $(NAME)..." + @rm -f $(NAME) + @echo "๐Ÿ’€ Full clean complete!" + +re: fclean all + +.PHONY: all clean fclean re