WIN32API FrameWork/한단계씩 직접 구현

29. CreateObject 메소드 수정

hyrule 2022. 5. 23. 19:03

http://hyrule.tistory.com/111 

 

*** 공부 방법 ***

1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처

hyrule.tistory.com

 


[사전 지식]

- this는 nullptr이 될 수 없다.(에러가 발생한다.)


▼해당 코드를

public:
	template <typename T>
	T* CreateObject(const std::string& Name = "GameObject",
		void* Master = nullptr)
	{
		//들어온 T타입의 게임오브젝트를 생성한다.
		T* Obj = new T;


		//초기화 함수를 작동시키고 실패하면 다시 제거하고 nullptr을 반환한다.
		if (!Obj->Init((CGameObject*)Master))
		{
			//방금 만들어진 변수여서 굳이 딴데 참조받는 곳이 없으므로 SAFE_DELETE
			SAFE_DELETE(Obj);
			return nullptr;
		}

		//자신을 생성한 CScene을 등록한다.
		Obj->SetOwnerScene(this);
		//이름을 설정해준다.
		Obj->SetName(Name);

		//생성된 게임오브젝트를 관리하는 m_ObjList에 업캐스팅하여 삽입한다.
		m_ObjList.push_back((CGameObject*)Obj);

		if (Master)
		{
			AddSlave<CGameObject>((CGameObject*)Master, (CGameObject*)Obj);
		}
	

		return Obj;
	}

 

 

▼이렇게 수정해준다.

순서만 바꾼 것이다.

public:
	template <typename T>
	T* CreateObject(const std::string& Name = "GameObject",
		void* Master = nullptr)
	{
		//들어온 T타입의 게임오브젝트를 생성한다.
		T* Obj = new T;

		//자신을 생성한 CScene을 등록한다.
		Obj->SetOwnerScene(this);
		//이름을 설정해준다.
		Obj->SetName(Name);

		//초기화 함수를 작동시키고 실패하면 다시 제거하고 nullptr을 반환한다.
		if (!Obj->Init((CGameObject*)Master))
		{
			//방금 만들어진 변수여서 굳이 딴데 참조받는 곳이 없으므로 SAFE_DELETE
			SAFE_DELETE(Obj);
			return nullptr;
		}


		//생성된 게임오브젝트를 관리하는 m_ObjList에 업캐스팅하여 삽입한다.
		m_ObjList.push_back((CGameObject*)Obj);

		if (Master)
		{
			AddSlave<CGameObject>((CGameObject*)Master, (CGameObject*)Obj);
		}
	

		return Obj;
	}

< 바꾼 이유 >

- 이전에는 초기화 과정을 먼저 거치고, 자신을 생성한 CScene의 정보를 등록하였음.

그런데 이렇게 했을 경우, 특정 상황에서 문제가 발생한다.

 

-- 만약 CreateObject() 메소드 안에서 특정 클래스의 초기화 함수를 호출하고,

호출된 클래스에서 또 다시 새로운 클래스를 CreateObject() 메소드를 통해 생성했을 때 문제가 발생한다.

-- 등록되지 않아서 nullptr이 들어 있는 변수를 통해 CreateObject()를 호출하고,

호출된 CreateObject()에서 this를 사용하는데, this가 nullptr이여서 에러가 나버린 것이다.

 

 

<수정 전>

 

 

 

<수정 후>