싱글톤

먼저 매크로를 정의해준다 (#define을 통헤 GET_SINGLE, DEFINITION_SINGLE, DESTROY_SINGLE)

1. 01. Core를 먼저 만든다.

2. main에서는 CCore를 Init한 후에 CCore의 run을 불러옴. 그 후 Run에서 return 후에는 Destroy.

   (Run에서는 while문을 통해 출력)

3. value.h에는 Input(입력 제네릭 함수)

4. 01. Core에는 크게는 Init과 Run 함수가 있다.

5. 02. Stage 클래스. (싱글톤으로 구성).

6. Stage클래스에도 Init과 Run.

7. Stage클래스는 Core에서 쓰이기 때문에 Core내부에서 #include "CStage.h"

8. CCore Init에서 Stage를 Init해줌.

9. Stage의 부모를 만든다.(CStage) (스테이지 클래스를 여러개만들면 타입이 다르기 떄문에 관리 힘듬. 따라서 부모를 생성하여 업캐스팅을 통하여 관리)

10. CStage의 자식들(CStageEasy, CStageNormal, CStageHard)을 만든다.

11. STL vector와 list를 사용하자.

12. StageManager에서 vector<class CStage*> m_vecStage;로 부모 클래스 벡터를 전방선언. StageNormal.h StageEasy.h StageHard.h 헤더 포함시켜준다.

13. StageManager에 CreateStage(stageType eType)

14. 생성된 Stage는 vector에 push_back으로 들어간다. (SAFE_Delete_VecList함수 만든다. iterator사용해서)

15. StageManager Init에서 CreateStage(ST_EASY), CreateStage(ST_NORMAL, CreateStage(ST_HARD) 함수 호출.

16. CStage와 CStageEasy,Normal,Hard는 부모자식 관계이므로 Init은 가상 함수로 작성. CStage는 가상 클래스. 자체적으로 생성 불가능

17. 윗줄 덕분에 StageEasy와 Normal, Hard의 Init()과 Run()함수를 호출할 때 각각 다른 코드를 부를 수 있다. (하나의 부모를 통해 관리를 하기떄문에 용이함. 그래서 업캐스팅 사용!)

18. CObjectManager(SingleTon) > CObj > CPlayer = CMonster 단계로 설계.


STL

벡터 

리스트 

스택 

큐 

맵->이진트리(탐색에 특화) why? 특정 기준에 따라 나눔. 

레드블랙 이진트리로 되어있음. 

상속.

CParent 부모


CChild : public CParent

CChild : proteced CParent

CChild : private CParent


외부접근에서만 바뀐다. 내부에서는 부모의 멤버가 public protected면 무조건 접근가능.


만약 CChild가 public으로 CParent를 상속받으면 CParent에서 받아온 public 멤버들은 외부에서 접근 가능


하지만 상속을 2중이상 할 경우 접근제어에 영향을 받는다.

(CParent의 모든 멤버에 CChild: private CParent후 CCChild : (public || protected || private) CChild의 경우 할아버지의 모든 멤버 근 불가능)


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


CParent* pParent = new CChild; (업캐스팅)

의 경우


CChild* pChild = (CChild*)pParent; (다운캐스팅)

CChild1* pChild1 = (CChild1*)pParent; (다운캐스팅)


오류날 수 있다. pParent는 CChild를 캐스팅 받았는데 CChild1과 CChild의 할당 크기가 다를 수 있으므로.


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


가상함수 virtual. 

부모에 가상함수를 선언하면 가상함수 테이블 생성. 자식에서 해당 함수를 재정의 해준 후 호출시에 테이블을 참고해서 가져온다.


부모 클래스의 소멸자는 항상 가상 소멸자로 선언해준다.

 => 소멸자 호출 후 가상 함수 테이블을 참고하여 부모의 소멸자까지 호출해줌.


순수 가상함수

 virtual void PPPPPPPPP() = 0;

 순수 가상 함수는 구현부가 존재하지 않는다. 

 순수 가상 함수를 가지는 클래스를 추상 클래스라고 한다.

 추상 클래스는 객체(인스턴스) 생성이 불가능하다.

 순수 가상함수는 자식에서 반드시 재정의 해야한다. 

 왜냐하면 순수 가상함수는 정의부분이 없기 때문에 반드시 자식에서 재정의해서 사용할 목적으로

 만들어주는 함수이기 때문.


템플릿

컴파일 단계에서 타입을 결정짓는 기능.

template <typename 원하는이름>

template <class 원하는이름>


 ex) template <typename T>

void Output(){

cout << typeid(T).name() << endl;

}

사용시 Output<int>();

Output<float>();

Output<CStudent>();

Output<_tagStudent>();

결과 : int

   float

   class CStudent

   struct tagStudent


인라인 함수

인라인함수는 매크로(#define)와 비슷함

헤더파일에서 함수 몸체까지 넣으면 컴파일러가 자동으로 인라인 처리하는데 줄 수가 길어지면 컴파일러가 자동으로 인라인x 시킴.

장점 : 스택에서 호출하지않고 실행. 단점 : 파일 크기가 커진다. (호출시에 코드를 직접가져와서 삽입되어 컴파일되기 때문)


Iterator

반복자. 자료구조의 처음부터 끝까지 순차적으로 탐색.


Friend

친구로 만들어 준다.

friend class CLinkedList; 

==> CLinkedList의 private와 protected 접근 가능해진다. 단, 템플릿 클래스의 경우 template <typename T>를 해주어야 함.


unsigned int size() const

멤버 함수뒤에 const를 붙여주면 함수 내에서 멤버 변수의 값을 변경할 수 없다.

GetAsyncKeyState

마리오게임 (벽돌깨기, 아이템)


 - 벽돌깨기 -> 아이템 생성 -> 아이템 먹기 -> 총알(Bullet Class//Init, Update) // ObjectiveManager에서 Player와 Bullet 관리.

ObjectiveManager의 Update에서 Player Update와 Bullet Update 불러옴.

콘솔에서도 마우스 작동 가능.ch

+ Recent posts