//CEntity.h의 CEntity클래스 내부.
private:
// 1
const UINT m_ID;
// 2
UINT g_NextID = 0;
// 1
CEntity::CEntity()
: m_ID(0)
{}
// 3
CEntity::CEntity()
: m_ID(g_NextID++)
{}
1번처럼 0으로 기본 생성자를 초기화해버리면 객체가 만들어질떄마다 ID값이 0으로 항상 초기화되므로 이렇게 하면 안된다.
2번 CEntity.cpp에서만 작동하는 전역변수 0으로 초기화해서 해둔다.
43억개까지의 객체까지는 고유한 ID값을 줄수 있다.
43억개의 객체를 언젠간 게임을 계속 켜두면 ID값을 초과 할수도 있다.(전나 오래걸린다.)
이걸 방지하고 싶다면 특정 ID를 가지고 있는 오브젝트가 삭제될때마다 비었다는걸 어디다 기록을 해야 한다.
3번에 아이디값이 들어올때마다 전역변수 선언해준거에 후위연산을 해주면 된다.
2번처럼 선언을 해두면 보안에 취약함이 있다.
static UINT g_NextID = 0;
static
를 사용해서 사용했다.// CEntity.h의 CEntity 클래스 내부,
private:
// 1
static UINT g_NextID;
1번은 정적 맴버 선언이라고 한다.
특정 클래스 내에 맴버로 정적변수를 선언
함수 안에서 static를 붙이면 함수 안에 소속되어 있는게 아니라 데이터 영역에 있고 함수 내부에서만 접근 하는것처럼
클래스 내부에 static로 선언을 한다면 데이터 영역에 존재하고 클래스 영역에서만 사용 가능하다.
// CEntity.h의 CEntity 클래스 내부,
public:
// 1
static UINT g_NextID;
// CEntity.cpp
UINT CEntity::g_NextID = 0;
// main.cpp의 메인함수 내부다.
CEntity::g_NextID = 100;
언제나 static이란 키워드가 정적이다라는 의미여서 선언된 곳에서 접근하는 그곳의 전용이 된다.
함수 내
파일
클래스
암기할 필요없다. static키워드의 핵심 동작만 알면 된다.
// 1
// void SetID(UINT _id) { m_ID = _id; }
// 2
UINT GetID() { return m_ID; }
1번처럼 아이디 새로 세팅할려는 함수는 불가능하다 const로 아이디를 막아두었기 떄문이다.
2번처럼 아이디의 값을 보는것은 가능하다.
// pch.h(미리컴파일된 헤더파일)
#include <string> // 문자열 전용 관리
// 1
vector<char>
string;
// 2
vector<wchar_t>
wstring;
// 3
using std::string;
using std::wstring;
1번과 2번 둘다 자료형이 지정된 벡터 클래스다.
vector의 문자열 전용 담당 클래스라 벡터에서 제공안해주는 문자열 operator을 추가로 더 제공해준다.
const UINT m_ID; // 객체별 고유 ID
// 1
wstring m_strName;
void SetName(const wstring& _Name) { m_strName = _Name; }
const wstring& GetName() { return m_strName; }
// main.cpp
CEntity entity1;
entity1.SetName(L"Entity 1");
CEntity entity2;
entity2.SetName(L"Entity 2");
CEntity entity3;
entity3.SetName(L"Entity 3");
// main.cpp
int size = sizeof(CEntity);
// CEntity.h 파일 내부
private:
// 1
static UINT g_NextID; // 특정 클래스 내에 맴버로 정적변수를 선언
private:
// 2
const UINT m_ID; // 객체별 고유 ID
// 3
wstring m_strName;
class TestClass
{
public:
int a;
};
class TestClassChild
:public TestClass
{
public:
int b;
};
class TestClass
{
public:
int a;
public:
TestClass()
{
}
virtual ~TestClass()
{
}
};
virtual
키워드가 만약 없다면 vtable포인터가 없는 그냥 4바이트다.// CEntity.h의 순수 가상함수 제시.
public:
virtual CEntity* Clone() = 0;
Clone함수를 제시할것이다.
CEntity 클래스는 추상클래스이다.
Clone함수 사용처
객체.Clone
하면 반환값으로 몬스터의 본인이랑 똑같은 복제본이 나오게한다.1차 24.01.19
2차 24.01.22
3차 24.01.23
4차 24.01.24
5차 24.01.25