8항목 9항목 10학목까지 오면서 익혔던 개념들에 대하여, 정리를 해 보는 코너이다. 1. 중요한 예외 안전에 관한 보증은 무엇인가? 2. 막 구현한 Stack에서, 포함하는 T의 필수사항은 무엇인가? 답 1. 답이라고 할것 까진 없지만, 의미상 그렇다는 뜻이다. (Effective C++ 을 보게 되면, 정리된것이 나와 있으니 자세한것은 그것을 참고 하도록) 기본 보증 : 예외가 있어도 Stack 개체의 자원에 피해가 가지 않는다. 강한 보증 : 예외에 의해 연산이 중단되도, 프로그램 상태는 바뀌지 않는다. 완벽 보증 : 어떠한 상황에서도 예외를 발생시키지 않는다. 아무리 못해도 기본 보증은 있어야 된다고 본다. 2. T::T 기본 생성자 T::T(const T& rhs) 복사 생성자 T& T::ope..
Exceptional C++ 검색 결과
극강 난이도 9½ 이다. 기본 생성자와 소멸자, 복사 할당자와 복사 생성자를 만들었다면, 이제 스택의 인터페이스를 만들어야 된다. 지금까지 한것들을 간축하게 정리하게 되면 template class Stack { public: Stack(); ~Stack(); Stack( const Stack& ); // 복사 생성자 Stack& operator=( const Stack& ); // 복사 할당자 private: T* v_; // T의 vsize_를 위해 size_t vsize_; // 충분히 큰 메모리를 가리키는 size_t vused_; // 포인터 T의 실제 사용 개수 }; 문제 : Count(), Push(), 그리고 Pop()를 예외에 안전하도록 작성해 보도록 하자. Count( ) templat..
다시 Stack 템플릿 클래스를 가져 온다. template class Stack { public: Stack(); ~Stack(); Stack( const Stack&); // 복사 생성자 Stack& operator=(const Stack&);// 복사 할당자 /* .... */ private: T* v_; // T의 'vsize_'를 위해 충분히 size_t vsize_; // 큰 메모리를 가리키는 포인터 size_t vused_; // T의 실제 사용 개수 }; 문제 : 이제 예외에 안전한 복사 생성자와 복사 할당자를 만들어 보아라. 곰곰히 생각해 보면 복사 생성자와 복사 할당자는 서로 같은 로직이 들어 갈 수 밖에 없을 것이다.( 왜냐하면, 복사된다는 전제가 똑같이 깔리기 때문이다,) 그래서 복..
예외 처리와 템플릿은 C++의 가장 강력한 기능이다. 하지만 템플릿의 어떤 함수가 예외를 일으킬지 모르는 상태에서, 예외에 안전한 코드를 작성하기 어렵다. 이번 항목은 예외처리와 템플릿이라는 두 가지 주요 기능을 어떻게 하면 예외에 안전하고, 예외에 중립적인 일반 컨테이너를 작성하면서 배우게 해준다. 자 그럼 컨테이너의 기초격인 Statck 을 예외에 안전하고 중립적으로 만드는지 배워보도록 하자. template class Stack { public: Stack(); ~Stack(); /* .... */ private: T* v_; // T의 'vsize_'를 위해 충분히 size_t vsize_; // 큰 메모리를 가리키는 포인터 size_t vused_; // T의 실제 사용 개수 }; 문제 : 어떻..
1994년, Tome Cargill은 "Exception Handling : A False Sence of Security를 발표했다. 이 당시만 해도 예외에 안전한 코드를 어떻게 작성하는지 완전히 이해하지 못했다는 것을 의미하는 발표였다. Tome Cargill은 모든 사람에게 이 문제에 대한 결정적인 해결책을 설명하도록 도정장을 내민 것이였다. 그러던 1997년, Guru of the Week #8이 인터넷 뉴스그룹에 등장했고, 이것은 Cargill의 도전에 대한 첫 번재 완벽한 해결책이였다. 이것은 그 해 말, 표준 C++ 초안(draft)에 최종적으로 적용시키기 위해 갱신되고, 3개의 완벽한 해결책 이상을 설명하는 최종버전인 "Exception-Safe Generic Containers"란 이름으..
단순한 라인 3개를 처리하는 이 함수에 있어서 얼마나 많은 실행 경로가 존재하는지 세어보자. 전제 조건 1. 판단하는 함수의 매개변수 순서는 무시하고, 실패한 소멸자도 무시하고 세어야 한다. 2. 호출된 함수들은 실패 또는 성공만 생각하여 세어야 한다. 3. 유일한 함수 호출 흐름으로 보고 같은 경로로 빠저나간다고 생각하여 세어야 한다. string EvaluateSalaryAndReturnName( Employee e ) { if( e.Title() == "CEO" || e.Salary() > 100000 ) { cout 를 프로그래머 제공 함수라면 예외가 발생 할 수 있음 11. 7번, 10번과 유사하게 ||를 프로그래머가 제공한 함수라면 예외를 일으킬 수 있다. cout
최근댓글