일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- implicit conversion
- 오블완
- 암시적 변환
- 메타테이블
- 상속
- 언리얼
- effective stl
- 다형성
- UE4
- virtual function
- Smart Pointer
- 함수 객체
- 스마트 포인터
- Effective c++
- reference
- 티스토리챌린지
- exception
- 반복자
- 영화
- 루아
- 비교 함수 객체
- lua
- resource management class
- 참조자
- more effective c++
- 영화 리뷰
- 예외
- operator new
- 게임
- c++
- Today
- Total
목록c++ (138)
스토리텔링 개발자
항목 40. 함수 객체 클래스는 어댑터 적용이 가능하게(adaptable) 만들자 C++11 이후로는 더 이상 맞지 않는 이야기이므로 참고할 것.ptr_fun와 adaptable아래는 잘 동작하는 코드이다.list widgetPtrs;bool isInteresting(const Widget* pw);list::iterator i = find_if(widgetPtrs.begin(), widgetPtrs.end(), isInteresting);if(i != widgetPtrs.end()){ ... // interesting한 widget에 대한 첫째 포인터 처리}그렇다면 int..
항목 39. 술어 구문은 순수 함수로 만들자 술어 구문(predicate)bool값을 반환하는 함수판독의 기준이 되는 로직을 포함하는 구문이다. 순수 함수(pure function)함수가 반환하는 값이 그 함수의 매개 변수에 종속되는 함수f(x, y)의 반환값은 x, y가 바뀔 때에만 변한다.즉, 매개변수가 아닌 내부에 존재하는 데이터는 const여야 한다. 술어 구문 클래스(predicate class)operator()가 술어 구문인 함수 객체 클래스 술어 구문 클래스는 복사에 신경써야 한다.함수 객체는 값으로 전달되기 때문이다.(항목 38 참조)그리고 STL 알고리즘이 내부적으로 함수 객체의 사본을 따로 보관할 수도 있다.그러므로 술어 구문 함수는 반드시 순수 함수여야 한다. 잘못 ..
항목 38. 함수 객체 클래스는 값으로 전달되도록(pass-by-value) 설계하자 매개변수로서의 함수와 함수 객체함수는 포인터 형태로 매개변수로 넘겨진다.void qsort(void* base, size_t nmemb, size_t size, int (*cmpfcn)(const void*, const void*));// cmpfcn을 자세히 살펴보면 값으로 전달되고 있음을 알 수 있다.// 즉, 함수 포인터는 값으로 전달된다.STL 함수 객체는 이 함수 포인터를 본떴으므로, 동일하게 값으로 전달된다.templateFunction for_each(InputIterator first, InputIterator last, Function f);// Function은 값 전달 / 값 반환이 이루어짐을 알..
항목 37. 범위 내의 데이터 값을 요약하거나 더하는 데에는 accumulate나 for_each를 사용하자 범위 요약(summarize)예를 들자면컨테이너 string 요소들의 길이의 총합을 구한다.주어진 범위의 숫자들의 곱을 구한다.좌표 등 2차원 이상의 값들의 평균을 구한다. 헤더에 있는 수치 알고리즘인 accumulate을 사용하자. accumulateaccumulate의 첫 번째 형태두 개의 반복자와 초기값을 인자로 받는다.범위 내의 값의 합 + 초기 값을 반환한다.list ld;...double sum = accumulate(ld.begin(), ld.end(), 0.0);// 0.0을 초기값으로 주었기에, 합을 double로 하여 정상값이 리턴된다.double sum = accum..
항목 36. copy_if를 적절히 구현해 사용하자 copy 알고리즘모던 C++ 이전에는 아래와 같은 copy 알고리즘들만이 있었다.copycopy_backwardreplace_copyreverse_copyreplace_copy_ifunique_copyremove_copyrotate_copyremove_copy_ifpartial_sort_copyuninitialized_copy즉, copy_if가 없어서 구현해야 했다.어떤 식으로 구현해서 사용했었는지 재미로나마 알아보자. copy_if가 필요한 상황bool isDefective(const Widget& w); // Widget이 문제가 있는지 알려주는 함수vector widgets;...// c++11 이전에는 이게 안됐다..copy_if(widg..
항목 35. 대소문자를 구분하지 않는 문자열 비교는 mismatch 아니면 lexicographical_compare를 써서 간단히 구현할 수 있다. 대소문자를 구분하지 않기구분하지 않는 정도를 얼만큼이나 원하는가.국제화(internationalization) 사항은 무시하고 단지 strcmp 동작 정도만 원한다면 쉽다.다국어 처리까지 원한다거나, 기본 로케일 이외의 로케일을 사용한다면 어렵다.하지만 이번 항목에서 다루는 것은 쉬운 버전이다. 문자열을 비교하는 인터페이스 두 가지strcmp와 비슷한 인터페이스음수, 0, 양수를 반환한다.operatortrue, false를 반환한다. 첫 번째 버전// 대소문자 구분 없이 문자 비교 함수int ciCharCompare(char c1, char c..
항목 34. 정렬된 범위에 대해 동작하는 알고리즘이 어떤 것들인지 파악해 두자 알고리즘은 늘 범용적이진 않다.모든 알고리즘이 어떤 범위든 받아서 잘 동작하는 것은 아니다.remove(항목 32, 33 참조) 알고리즘은 대입 연산이 가능한 순방향 반복자만을 받는다.map과 set에는 사용할 수 없다.(항목 22 참조)정렬 알고리즘(항목 31 참조)은 임의 접근 반복자만을 받는다.list에는 사용할 수 없다.이런 규정을 어길 시 컴파일이 되지 않고, 에러 메시지(항목 49 참조)가 발생한다.특히, 정렬된 범위를 넣어야 하는 알고리즘에 정렬되지 않은 범위를 넣는다면미정의 구현이므로 어떤 결과가 나타날지 모른다. 정렬된 범위를 넣어야 하는 알고리즘정렬된 범위를 넘겨야 원하는 효율이 나오는 알고리즘binar..
항목 33. remove와 비슷한 알고리즘을 포인터의 컨테이너에 적용할 때에는 각별히 조심하자 포인터 요소 제거품질 보증 함수를 기준으로 벡터의 Widget 포인터 요소를 삭제하는 코드class Widget{public:... bool isCertified() const; // Widget의 품질이 확실한가...};vector v;...v.push_back(new Widget);...// 품질 보증이 되지 않은 Widget 객체 삭제// mem_fun(항목 41 참조)v.erase(remove_if(v.begin(), v.end(), not1(mem_fun(&Widget::isCertified))), v.end());만약 remove_if 호출 전 상황이 아래와 같다면remove_if 호출 후에..