const_iterator 는 iterator 와 달리 수정하면 안 되는 값들을 가리킨다. 표준 관행에 따르면 가능한 한 항상 const 를 사용하라는 말에 따라 가능하다면 const_iterator 를 사용하는 것이 좋다. 예시를 보면서 이해해보도록 하자. std::vector values; ... std::vector::iterator it = std::find(values.begin(), values.end(), 1983); values.insert(it, 1998); 위의 코드는 1983 이라는 값을 찾아 그 위치에 1998 이라는 값을 삽입하는 코드이다. 여기서 주목해야할 점은 find 함수로 찾은 iterator 를 직접 수정하는 일은 없다는 것이다. 이것을 표준 관행에 따르도록 하면 iter..
C++11에 오면서 override라는 키워드가 생겼다. java를 해본 사람이라면 @override라는 어노테이션을 본 사람이 있을 것이다. 이 어노테이션은 컴파일러에게 오버라이된 함수라는 것을 알려줘서 부모 클래스으로 부터 상속 받을 함수가 없다면 컴파일시에 알려준다. C++에서도 override 키워드가 똑같은 역할을 한다. 오버라이드 키워드를 만족하는 조건은 다음과 같다. 기반 클래스 함수가 반드시 가상 함수이어야 한다. 기반 함수와 파생 함수의 이름이 반드시 동일해야 한다(단, 소멸자는 예외). 기반 함수와 파생 함수의 매개변수 형식들이 반드시 동일해야 한다. 기반 함수와 파생 함수의 const성이 반드시 동일해야 한다. 기반 함수와 파생 함수의 반환 형식과 예외 명세가 반드시 호환되어야 한다...
제목만 보면 내용이 어려워보일수 있는데 사실은 어렵지 않다. 다시 정리해보면 private 를 이용해 함수를 숨기지 말고 delete 키워드를 사용하라는 의미이다. 이렇게 고의적으로 함수를 없애는 경우는 우리가 많이 사용하는 싱글턴이나 팩토리 패턴들을 사용하는 경우이니 알아두는것이 좋다. 어떻게 다른지 예제를 보자. class MyObject { // private을 사용하는 경우 private: MyObject(); // delete 키워드를 사용하는 경우 public: MyObject() = delete; }; 여기서 delete 키워드를 사용한 경우에 public으로 사용한 것을 볼 수 있는데 이는 의도적으로 더 나은 오류 메시지를 받기 위함임을 알아두길 바란다. 위의 두 코드의 목적은 똑같다. 외..
enum과 enum class가 있다. 둘의 차이는 범위가 있냐 없냐의 차이가 있다. 어떤 차이가 있는지 알아보자. Scope 문제 일반적으로 중괄호 쌍이 정의하는 범위로 가시성이 정해지는데, enum의 경우에는 그렇지 않다. 예시를 보자. enum Color { black, white, red }; auto white = false; // 오류 white가 이미 선언되어 있음 white의 스코프 문제로 똑같은 white를 선언할 수가 없다. 하지만 범위 있는 enum은 그렇지 않다. enum class Color { black, white, red }; auto white = false; Color c = white; // 오류 범위 안에 white라는 이름의 열거자가 없음 Color c = Color..
C++11에는 별칭 선언(alias declaration)을 제공한다. 별칭 선언이란 typedef를 대체할 수 있으면서 몇가지 장점들이 있다. 먼저 둘의 차이를 보자. typedef std::unique_ptr UPtrMapSS; using UPtrMapSS = std::unique_ptr; typedef보다 별칭 선언을 선호해야하는 이유는 바로 별칭 템플릿(alias templates) 때문이다. template using MyAllocList = std::list; template struct MyAllocList { typedef std::list type; }; 당장 위에만 봐도 별칭 선언을 사용한 경우가 간단하다. 게다가 이를 다른 클래스에서 사용하려면 이름 앞에 typename을 꼭 붙여야한..
객체를 생성하는 방법은 생각보다 다양하다. 아래와 같은 방법이 존재한다. int x(0); int y = 0; int z{ 0 }; int z = { 0 }; 위의 4가지 방법 모두 똑같은 결과를 나타낸다. 그 중에서 중괄호({})로 나타낸 생성 방법을 바로 균일 초기화(uniform initialization)이라고 한다. 균일 초기화 도입 배경 균일 초기화라고 부르는 이유는 어떤 상황에서든 균일하게 초기화를 할 수 있기 때문이다. 균일 초기화를 도입하게 된 3가지 배경을 먼저 알아보자. 컨테이너 초기화 vector와 같이 배열의 경우 초기 값들을 지정할 수 있다. std::vector v{ 1, 3, 5 }; // v의 원소는 1, 3, 5 멤버 초기화 non-static 자료 멤버를 초기화 하는데 ..
앞의 포스트에 이어서 GetScaledAxis 가 무엇인지 알아보자. 이전 포스트를 안보았다면 먼저 보고오길 바란다. [Unreal Engine 4] AController::GetControlRotation 이해하기 FPS나 TPS 게임를 만들때 위의 함수를 자주 사용하곤 한다. 언리얼 공식 도큐먼트에서도 위의 함수를 사용하는 것을 볼 수 있다. https://docs.unrealengine.com/ko/Programming/Tutorials/FirstPersonShooter/2/3.. pppgod.tistory.com 로컬 좌표계 캐릭터를 기준으로 생성되는 좌표계를 로컬 좌표계라고 한다. 로컬 좌표계의 축은 다음과 같이 생성된다. X축: 캐릭터가 바라보는 방향 Y축: 캐릭터가 바라보는 방향에서 오른쪽 ..
FPS나 TPS 게임를 만들때 위의 함수를 자주 사용하곤 한다. 언리얼 공식 도큐먼트에서도 위의 함수를 사용하는 것을 볼 수 있다. https://docs.unrealengine.com/ko/Programming/Tutorials/FirstPersonShooter/2/3/index.html 2.3 - 캐릭터 동작 함수 구현 일인칭 슈팅 캐릭터에 대한 동작 함수 구현법을 배워봅니다. docs.unrealengine.com 이 함수가 무엇을 의미하는지 알아보자. FRotator 이 함수의 반환타입은 FRotator 이다. FRotator 는 3개의 값을 가지고 있는데 Pitch, Roll, Yaw 이다. 이 용어는 바로 오일러 축(Euler angle)에서 들어본 용어일 것이다. 이 3개의 값은 각각 y, ..
- Total
- Today
- Yesterday
- std::forward
- 보편 참조
- 발아시기
- 보편참조
- C++11
- detach
- Override
- C
- 다이소
- Perfect
- auto
- thread
- C++14
- 포인터
- MOVE
- async
- Effective Modern C++
- Modern
- Unreal
- Overloading
- CPP
- const
- Forwarding
- forward
- 람다
- Effective
- Join
- C++
- std::move
- Future
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |