*** 공부 방법 ***
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 |