묻공러
'C++' 카테고리의 글 목록 (6 Page)

C++

C++/[루키스] Modern C++

[MC++] nullptr

nullptr의 의미와 사용 이유 class Test { public: Test(int a) { } Test(void* ptr) { } Knight* FindKnight() { return nullptr; } } int main() { int ptr = NULL;// 예전 사용 방식 //1) 오동작 방지 Test(0);// Test(int a) 생성자 생성 Test(NULL);// Test(int a) 생성자 생성 Test(nullptr);// Test(void* ptr) 생성자 생성 //2) 가독성 Knight* knight = FindKnight(); if(knight == nullptr) {} } nullptr 구현 const class Knight { public: // 그 어떤 타입의 포인터와도..

C++/[루키스] Modern C++

[MC++] 중괄호 초기화 {}

일반적으로 초기화하는 경우는 ()를 사용하고 특히, 배열의 경우에서는 {}를 사용한다 추가적으로, 본 내용과는 큰 관련은 없지만 클래스에서의 복사 생성자와 대입 연산자의 차이와 함께 클래스에서의 (), {} 초기화를 알아보자 Knight k1; Knight k2 = k1;// 복사 생성자 Knight k3;// 기본 생성자 k3 = k1;// 대입 연산자 Knight k4(k3);// () 초기화 Knight k5{k3};// {} 초기화 다시 돌아와서, 중괄호 초기화를 도입함으로써 아래와 같은 장점이 있다 1) vector 등 container와 잘 어울린다 // 소괄호 초기화 vector v1(3, 1);// 3 capacity를 가지고 있고 1로 모두 초기화해라 // 중괄호 초기화 vector v2..

C++/[루키스] Modern C++

[MC++] auto

auto는 형식 연역 (type deduction)으로 자료형을 추론해 주는 기능이다 ex. class Knight { public: int mhp; }; int main() { auto a = 3;// int auto b = 3.14f;// float auto c = 3.14;// double auto d = Knight();// Knight auto e = "Hello";// const char* } 주의할 점! 기본적으로 auto는 const, & 무시가 된다 따라서 아래와 같은 경우를 주의해야 한다 vectorv; v.push_back(1); v.push_back(2); v.push_back(3); for (vector::size_type i = 0; i < v.size(); i++) { auto..

C++/[루키스] 콜백함수

[STL 사전지식] 6. 콜백 함수

콜백(Call back)은 다시 호출하는, 역으로 호출하는 뜻을 가지고 있다 특히, 게임을 만들 때 이런 콜백의 개념이 자주 등장한다 간단한 실습을 통해 콜백 함수를 구현해 보자 먼저, 우리가 배운 함수 포인터로 콜백 함수를 구현하면 아래와 같이 작성이 될 것이다 class Item { public: int _itemId = 0; int _rarity = 0; int _ownerId = 0; }; Item* FindItem(Item items[], int itemCount, bool(*func)(const Item*)) { for (int i = 0; i < itemCount; i++) { Item* item = &item[i]; // 조건 체크 return item; } } 하지만, 이렇게 함수 포인터..

C++/[루키스] 콜백함수

[STL 사전지식] 5. 템플릿 기초 (2)

이번 시간에는 클래스 템플릿에 대해 알아보자 먼저 클래스 템플릿 없이 아래와 같은 코드를 작성한다고 해보자 class RandomBox { public: int GetRandomData() { int idx = rand() % 10; return _data[idx]; } public: int _data[10]; }; class RandomBoxFloat { public: float GetRandomData() { int idx = rand() % 10; return _data[idx]; } public: float _data[10]; }; int main() { srand(static_cast(time(nullptr))); // rand함수 시드설정 RandomBox rb1; for (int i = 0;..

C++/[루키스] 콜백함수

[STL 사전지식] 4. 템플릿 기초 (1)

STL을 들어가기 전 마지막 사전 지식인 템플릿에 대해 알아보자 템플릿은 함수나 클래스를 찍어내는 틀을 의미한다 1) 함수 템플릿 2) 클래스 템플릿 이렇게 두 가지 종류로 구분이 된다 이번 시간에는 함수 템플릿을 알아보고 다음 두 번째 시간에는 클래스 템플릿을 알아보도록 하자 그럼 템플릿을 어떻게 사용하는지 알아보기 전, 템플릿이 왜 필요한지 알아보자 void Print(int a){} void Print(float a){} void Print(double a){} void Print(const char* a){} 함수의 인자들의 타입에 맞게 내가 모든 함수를 위처럼 구현해 준다면 너무 귀찮을 것이다 템플릿 사용 방법을 그럼 알아보자 아래처럼 템플릿을 사용하면 훨씬 쉽게 사용이 가능해진다 templat..

C++/[루키스] 콜백함수

[STL 사전지식] 3. 함수 객체

이번 시간에는 함수 객체에 대해 알아보자 함수 객체 (Functor): 함수처럼 동작하는 객체 여기서 잠깐, 사실상 자주 쓰지도 않는 함수 포인터를 굳이 공부하고 함수 객체를 배워야 하는 이유가 무엇일까? 바로 함수 포인터의 단점을 보완한 것이 함수 객체이기 때문이다 그럼 함수 포인터의 장단점을 알아보자 함수 포인터의 장점은 무엇일까? 바로 동작을 넘겨줄 때 유용하다는 것이다 아래처럼 말이다 void Hello1(){} int main() { void (*pfunc)(); pfunc = &Hello1; (*pfunc)(); } 그러면 함수 포인터의 단점은 무엇일까? 1) 시그니처가 안 맞으면 사용할 수 없다 void Hello1() { } void Hello2(int number) { } int main..

C++/[루키스] 콜백함수

[STL 사전지식] 2. 함수 포인터 (2)

간단하게 저번 시간에 배운 함수 포인터를 복습해보자 아래와 같이 세 가지의 방식으로 함수 포인터를 만들 수 있었다 1) typedef 없이 만들기 2) typedef 함수 정의로 시작해서 만들기 3) typedef 함수 포인터 정의로 시작해서 만들기(이 부분은 조금 있다가 다룬다) int Test(int a, int b) { return a + b; } int main() { // 첫번째 방식 int (*fn1) (int, int); fn1 = &Test;// & 생략가능 // 두번째 방식 typedef int (FUNC_TYPE)(int, int); FUNC_TYPE* fn2; fn2 = &Test; // 간단하고 자주 사용하는 첫번째 방식에 익숙해져야함 } 여기서 잠깐, typedef에 대해 알아보고..

C++/[루키스] 콜백함수

[STL 사전지식] 1. 함수 포인터 (1)

STL을 공부하기 위한 사전지식 : 함수 포인터, 함수객체, 템플릿... 이번 시간에는 함수 포인터를 공부한다 함수 포인터도 결국 일반 포인터와 차이가 없기에 typedef로 정의 후, 포인터 변수로 이용하는 방식으로 사용해 보자 일반 포인터를 먼저 typedef로 정의 후, 포인터 변수로 이용해 보자 - typedef를 이용한 일반적인 변수 포인터 typedef int DATA; // typedef로 정의 DATA* pointer = &a; // 포인터 변수로 이용하기 위를 간단하게 나타내면 1) 포인터 * 2) 변수 이름 pointer 3) 데이터타입 int 그럼, 1] 함수를 typedef를 정의하고 2] 포인터 함수로 이용해 보자 - typedef를 함수에 사용해 보자 int func(int a,..