목록C++ (43)
방프리
1. 포인터에 대한 const 전파const 정확성에서 가장 실수가 많은 것은 const로 초기화된 객체가 멤버 포인터가 가리키는 값을 변경하는 것namespace exp = std::experimetal;class Foo{public: auto set_ptr(int* p) const { ptr_ = p; // not compiled } auto set_val(int v) const { val_ = v; // not compiled } auto set_ptr_val(int v) const { *ptr_ = v; // not compiled } private: exp::propagate_const ptr_ = ..
1. C 함수 포인터를 람다에 할당람단는 일반 함수 포인터로 변환이 가능, 해당 기능 때문에 람다는 캡쳐를 전혀 가질 수 없음 // old C library codeexternal void download_webpage( const char* url, void (*callback)(int, const char*)); auto func() { auto lambda = +[](int result, const char* str) {}; download_webpage("http://www.packet.com", lambda); } 2. 람다와 std::function모든 람다 함수는 자신만의 타입을 가지고 있으며, 동일한 두 개의 람다가 동일한 서명을 가지고 있어도 마찬가지다.std..
1. 변수에서의 auto 사용auto는 지역 변수에 대해 좌에서 우로 초기화하는 방식으로 사용하는 것을 선호 ex) auto i = 0;이동 불가능한 유형이나 복사 불가능한 유형에도 적용 가능2. const 참조const auto&와 같이 나타나는 const 참조는 어느 것과도 바인드가 가능const 참조는 수정을 원하지 않는 변수에 대한 기본적인 선택이어야 함auto func() { auto foo = Foo {}; auto& cref = foo.cref(); // cref는 const 참조 auto& mref = foo.mref(); // mref는 변경 가능한 참조}3. 가변 참조const 참조와 반대로 임시 객체와 바인드가 되지 않음auto&는 가변 참조를 표시하여 사용4. 전달 ..
오류 C1189 #error: MFC does not support WINVER less than 0x0501. Please change the definition of WINVER in your project properties or precompiled header. 라는 오류를 발견하였다. 윈도우 버전이 너무 낮기 때문에 발생하는 에러로 #define WINVER의 값을 수정하면 된다. * 컴파일러 버전 구분 값 1000 : Visual C++ 4.x (4.0) 1100 : Visual C++ 5 (5.0) 1200 : Visual C++ 6 (6.0) 1300 : Visual C++ .NET (7.0) 1310 : Visual C++ .NET 2003 (8.0) 1400 : Visual C++ ...
* SAFESEH ( Structured Exception Handling) 윈도우 상에서 예외처리를 하는 기법 - 메모리에 대한 손상이 발생하거나 시스템이 예기치 않게 종료되는 이벤트 발생시 프로그램에 대한 예외처리 담당 - 외부 공격자가 프로그램에 대해 예외처리 레코드를 덮어쓰게 되면 이 예외를 탐지하여 프로그램 종료 * 해결방안 (1) 옵션 On/Off 프로젝트 속성 - Linker - 고급 - 이미지에 안전한 예외처리기 포함 (예 /아니오) 혹은 명령줄에서 /SAFESEH:NO 입력 해결법 프로젝트 속성 - 구성 속성 - Linker - 명령줄 /safeseh:no
LNK2005 에러로 몇 시간동안 헤맸었다. 이 에러를 고치면서 발생원인이나 해결 방법 여러 개를 찾아보았는데 한번 정리해볼까 한다. 1. 헤더파일이 중복으로 선언된 경우 보통 이 경우는 그리 많이 발생되지 않을 것이라 생각된다. LNK2005 에러가 발생하는 주 원인이기는 하나 현재 Visual Studio에서 클래스를 생성하면 자동으로 #pragma once를 선언해주기 때문에 헤더 중복 선언이 일어나지 않을 것이기 때문이다. 일어난다면 아주 옛날 버전의 프로젝트에서 발생된 확률이 매우 크다. 해결방법으로는 #ifdef !defined _STDIO_H \n #define _STDIO_H 이렇게 해주면 된다. 2. 문제의 모듈을 찾아 순서대로 적용하는 것이다. - 링커 -> 명령줄에서 /verbose를..
항목 41. ptr_fun, mem_fun, mem_fun_ref의 존재에는 분명한 이유가 있다. 위의 함수들이 C++이 원래부터 가진 문법적 모순을 감싸주는 함수라고 합니다. (몰라요 전.... 저자가 그랬어요...) 무슨 모순인지 예제를 통해서 알아보겠습니다. f란 이름의 함수와 x란 이름의 객체가 있습니다. x에 대해 f를 호출하고 싶으며, 호출하는 위치는 x의 멤버 함수의 바깥쪽입니다. 이런 상황에서 다음과 같은 문법을 제공할 수 있습니다. f(x); // 문법 #1 : f가 멤버 함수가 아닌 경우 x.f(); // 문법 #2 : f가 x의 멤버 함수이고, x는 객체이든지 객체에 대한 참조자인 경우 p->f(); // 문법 #3 : f가 x의 멤버 함수이고, p는 x 객체에 대한 포인터인 경우 v..

항목 45. count, find, binary_search, lower_bound, upper_bound 그리고 equal_range를 제대로 파악해두자 (1). count : 작업 대상이 정렬되어 있지 않았을 때 사용합니다. 작업 후 true는 양수, false는 0으로 해석이 가능하며 작업이 시작되면 원하는 대상을 찾아도 범위 끝까지 갑니다. (2). find : 범위의 접근자를 지정해주어야 한다는 단점이 있지만 요소를 찾으면 바로 실행을 중단합니다. 객체의 존재 여부 뿐만 아니라 객체 자체에 대해 알고 싶을 때 사용합니다. (3). binary_search : 객체가 존재하는지 여부에 대해서만 확인합니다. 반환값은 bool 입니다. (4). lower_bound : 원하는 값을 가진 객체의 첫째 ..