일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- DirectX11
- Programmers
- baekjoon
- TObjectPtr
- NRVO
- 프로그래머스
- 줄 세우기
- C++
- 티스토리챌린지
- directx
- 오블완
- winapi
- UE5
- 1563
- RVO
- UnrealEngine5
- algorithm
- 언리얼엔진5
- UnrealEngine4
- 백준
- IFileDialog
- RootMotion
- const
- C
- Frustum
- Unreal Engine5
- 팰린드롬 만들기
- softeer
- GeeksForGeeks
- 2294
- Today
- Total
목록C++ (43)
Game Develop
Example 1. const키워드가 *앞에 선언될 경우 -> Heap에 락걸려있다는 느낌 int num1 = 4; int num2 = 61; const int* pNum = nullptr; pNum = &num1; // 정상적으로 수행 *pNum = 10; // Error const키워드가 *앞에 선언될 경우, 참조하는 값이 상수화된다. 그렇기때문에 pNum이라는 포인터변수의 값이 변경되는거는 상관없지만, 포인터가 가리키고있는 값의 변경에는 에러가 뜬다. Example 2. const키워드가 * 뒤에 선언될 경우 -> Stack에 락걸려있다는 느낌. int num1 = 4; int num2 = 61; int* const pNum = nullptr; pNum = &num1; // Error *pNum =..

프로그램을 개발하다보면 바탕화면에 있는 파일을 자신의 프로그램에 드래그앤드랍해서 사용해야하는 경우가있다. 예를들어 유니티에 새 프로젝트를 만든다면 그 프로젝트만의 Assets 폴더가 생길것이고 프로그램에서 폴더의 내용물을 표시할것이다. 이 때 바탕화면의 png파일이라던가 하는 파일들을 프로그램의 AssetsWindow에 드래그앤드랍하면 파일이 프로젝트의 Assets폴더에 복사가 돼서 프로그램에 표시가된다. WINAPI프로젝트의 디폴트로는 드래그드랍이벤트가 작성되어있지 않기때문에 따로 해줘야한다. 보통 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 에다가 HWND변수를 생성 후 초기화시켜줄텐데, 그다음에 DragAcceptFiles(hWnd, true); 실..
두가지 방법이 있다. 첫번째방법은 상당히 오래전부터 사용한 방법이고, 두번째 방법은 윈도우비스타 이후부터 권장되어진 방법이다. https://docs.microsoft.com/en-us/windows/win32/api/commdlg/nf-commdlg-getopenfilenamea GetOpenFileNameA function (commdlg.h) - Win32 apps Creates an Open dialog box that lets the user specify the drive, directory, and the name of a file or set of files to be opened. docs.microsoft.com MSDN에서 직접 언급했다. 샘플코드같은것들도 들어가서 조금만 뒤지면 나오..
Person(Person&& other) : m_ptr(other.m_ptr) { other.m_ptr = NULL; // 소멸자호출 방지하기위함. } ~Person() { delete m_ptr; } 복사생성자는 아예 새로 할당받는거고, 이동생성자는 호출된 인스턴스가 가지고있는 포인터변수의 주소값을 그대로 옮기는(이동)것이기 때문에 임시객체를 만들필요가없다. 그래서 더 빠르다. 생성자부분에서 other.m_ptr = NULL값을 넣어주는이유는, 안넣어주면은 other인스턴스가 소멸될 때 다른곳으로 이전된 m_ptr이 delete 되버리기 때문이다. 다른곳에서 쓰이고있는데 해제시켜버리면 안됨.
대입연산자는 이미 생성된 인스턴스에 다른 인스턴스를 대입할 때 수행된다. 디폴트로 얇은복사가 수행된다. 복사생성자와 헷갈리지 말아야 할 점으로, 복사생성자는 선언과 동시에 초기화할 때 수행되고 대입연산자는 '이미' 생성된 인스턴스에 다른 인스턴스를 대입할 때 수행된다는 것이다. 그렇기 때문에 복사생성자는 깊은복사가 되게끔 정의해놔도 대입연산시에는 얕은복사가 수행된다는 것이다.(아예 다른 작업이기 때문) 그렇기 때문에 대입연산자로 값복사를 하려할 경우 깊은복사생성자를 따로 정의해준것처럼 대입연산자도 따로 연산자 오버로딩을 해줌으로써 깊은복사를 하게 해줘야한다.
복사생성자란 C++에서 복사 생성자란 자신과 같은 클래스 타입의 다른 객체에 대한 참조(reference)를 인수로 전달받아, 그 참조를 가지고 자신을 초기화하는 방법이다. 복사생성자를 설명하면서 얕은복사와 깊은복사에 관해서도 간단하게 설명한다. 기본 복사 생성자 - 기본적으로 제공되는 생성자. 따로 정의 안해도 객체간의 변수의 값을 얕은복사(shallow copy)로 수행한다 - 객체를 선언함과 동시에 초기화할 때 수행된다. Ex) Object a; Object b = a; // 복사생성자 수행. b를 선언과 동시에 a의 값으로 초기화했기 때문. Object c(b); // 복사생성자 수행. 선언과 동시에 b의 값으로 초기화함. 이렇게 따로 사용자가 정의하지 않아도 기본적인 복사생성자는 수행된다. 하지..
김포프님이 정리해놓으신 C++ 코딩스탠다드. 절대 이게 무조건 맞다는게 아니라, 어떤걸로 해야할지 모를때 주어질 수 있는 선택지이다. docs.popekim.com/ko/coding-standards/cpp
꼭 싱글톤 사용시 주의점이라기보단 혼자 삽질한부분이 싱글톤쪽이라 기록을 남겨놓는다. 포트폴리오 작업 도중, 플레이어쪽 코드에서 스택오버플로우가 발생해서 스택호출을 추적해본 결과 싱글턴 인스턴스 할당하는 부분이 재귀함수마냥 뺑뺑이 도는걸 발견했다. 전날 딱히 건드린게 없다고 생각하긴 했는데 찾아보니 몬스터 생성자에서 GM->Get()->GetPlayer() 부분을 호출했기 때문에 생긴 문제였다. 원래는 Update에 두었기 때문에 생성자 이후에 호출되서 상관이 없었는데, 포인터만 받아오면 되는 부분이라 프레임마다 호출시킬 필요가 없기때문에 생성자부분으로 옮겨놨었다. 그렇게 바꾸고 오늘 빌드했더니 Player쪽에서 스택오버플로우가 발생했다. 현재 프로그램 구조가 대략 빌드 시 GameManager 싱글톤 인..