• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

factory pattern의 스마트 포인터화 시켜봤는대 이게 맞는지 모르겠네요

20.10.15 13:49 작성 조회수 132

0

//Example클래스는 변함이 없고

namespace jm
{
	class Example : public Game2D
	{

		float time = 0.0f;
		std::vector<std::shared_ptr <Shape>> my_objs;

	public:
		Example() : Game2D()
		{

			my_objs.push_back(Shape::makeTriangle(Colors::gold, vec2{ -0.5f,0.2f }, 0.25f));
			my_objs.push_back(Shape::makeCircle(Colors::olive, vec2{ -0.1f,0.1f }, 0.2f));
			my_objs.push_back(Shape::makeBox(Colors::black, vec2{ 0.0f,0.5f }, 0.1f, 0.3f));
			my_objs.push_back(Shape::makeStar(Colors::gold, vec2{ 0.0f,-0.5f }, 0.25f,0.15f));

			//my_objs.push_back(new Triangle(Colors::gold, { -0.5f,0.2f }, 0.25f));
			//my_objs.push_back(new Circle(Colors::olive, { -0.1f,0.1f }, 0.2f));
			//my_objs.push_back(new Box(Colors::black, { 0.0f,0.5f }, 0.1f, 0.3f));
		}
		~Example() {

		}
		void update() override
		{
			
			for (const auto &obj : my_objs) {
				obj->draw();
			}

			
		}
	};

//shape.h의 static 함수들을 
shared_ptr화 시켜주는 작업
#pragma once
#include "Game2D.h"
#include "Shape.h"


namespace jm {
	class Shape {
	public:
		vec2 pos;
		RGB color;

	

		void init(const RGB& _color, const vec2& _pos,float _r=0.0f)
		{
			this->color = _color;
			this->pos = _pos;
		}
		virtual ~Shape() {
			
		}
		virtual void drawShape() const = 0; //pure virtual classes

		void draw() {
			beginTransformation();
			{
				translate(this->pos);
				drawShape();
			}
			endTransformation();
		}	




		static std::shared_ptr<Shape> makeTriangle(const RGB& _color, const vec2& _pos, const float& _size);

		static std::shared_ptr <Shape> makeCircle(const RGB& _color, const vec2& _pos, const float& _size);

		static std::shared_ptr<Shape> makeBox(const RGB& _color, const vec2& _pos, const float& _width, const float& _height);

		static std::shared_ptr<Shape> makeStar(const RGB& _color, const vec2& _pos, const float& _outer_radius, const float& _inner_radius);




	};
}

//이렇게 해준 후 
//Shape.cpp
#include "Shape.h"

#include"Triangle.h"
#include"Circle.h"
#include"Box.h"
#include"Star.h"

namespace jm {
	std::shared_ptr<Shape> Shape::makeTriangle(const RGB& _color, const vec2& _pos, const float& _size) {
		return std::make_shared<Triangle>(_color, _pos, _size);
	}

	std::shared_ptr <Shape> Shape::makeCircle(const RGB& _color, const vec2& _pos, const float& _size) {
		return std::make_shared<Circle>(_color, _pos, _size);
	}

	std::shared_ptr <Shape> Shape::makeBox(const RGB& _color, const vec2& _pos, const float& _width, const float& _height) {
		return std::make_shared <Box>(_color, _pos, _width, _height);
	}
	std::shared_ptr <Shape> Shape::makeStar(const RGB& _color, const vec2& _pos, const float& _outer_radius, const float& _inner_radius) {
		return std::make_shared <Star>(_color, _pos, _outer_radius, _inner_radius);
	}
}

//위에처럼 바꿔주면 돼는거 같은대 

//소멸자가 정상적으로 호출되는거 같거든요 cout 찍어보니까 


//맞나요?

답변 1

답변을 작성해보세요.

0

안녕하세요? 코드를 자세히 봐드리기는 어렵습니다만,  make_shared를 잘 쓰신 것 같습니다. 더 자세한 내용은 따배씨++ 강의에서 다룹니다.