WIN32API FrameWork/한단계씩 직접 구현

29. CreateObject 메소드 수정

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이여서 에러가 나버린 것이다.

 

 

<수정 전>

 

 

 

<수정 후>

 

저작자표시 (새창열림)

'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글

31. 이미지 로딩을 위한 준비 - 경로 관리자  (0) 2022.05.24
30. 스킬 구현 2 - 아우렐리온 솔 W  (0) 2022.05.23
28. 스킬 구현 1 - 토네이도 총알  (0) 2022.05.23
27. 스킬 쿨타임  (0) 2022.05.23
26. Input 기능 개선 - 입력 바인딩 제거하기  (0) 2022.05.23
'WIN32API FrameWork/한단계씩 직접 구현' 카테고리의 다른 글
  • 31. 이미지 로딩을 위한 준비 - 경로 관리자
  • 30. 스킬 구현 2 - 아우렐리온 솔 W
  • 28. 스킬 구현 1 - 토네이도 총알
  • 27. 스킬 쿨타임
hyrule
hyrule
hyrule
C++ 프로그래밍 공부
hyrule
전체
오늘
어제
  • 분류 전체보기 (205)
    • C++기초 (50)
    • WIN32API FrameWork (109)
      • 한단계씩 직접 구현 (82)
      • 원본 (15)
      • 코드별 설명 개별저장(검색용) (12)
    • 자습 (21)
    • C++ TIPS (11)
    • 연습 노트 (3)
    • ETC (6)
    • DX2D StarCraft 모작 (1)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 스타크래프트
  • Tistory
  • Windows 11
  • hello
  • C++
  • notion

최근 댓글

최근 글

hELLO · Designed By 정상우.
hyrule
29. CreateObject 메소드 수정
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.