예외 처리와 템플릿은 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
효율적인 재사용은 훌륭한 소프트웨어 엔지니어링의 중요한 부분이다. 직접 작헝한 것들 대신에 표준 라이브러리 알고리즘을 사용하는게 얼마나 더 많은 이득을 얻을수 있는지 설명한다. (마이어스씨가 Effective STL 에서 알고리즘의 우수성에 대해서 아주 잘 말씀해 주신게 있다. 물론 곽용재님께서 번역을 이해하기 쉽게 해주셔서 이해하기가 쉬웠다. ^^) 항목 6 의 코드를 다시 가져 온다. std::string FindAddr( std::list emps, std::string name ) { for( std::list::iterator i = emps.begin(); i != emps.end(); i++ ) { // 이것 때문에 operator== 이 필요하다. if( *i == name ) { // 망..
불필요하거나 임시로 사용되는 개체들은 작업을 매우 어렵게 만들거나(임시 개체에 작업할수 있다는 위험성) 성능을 떨어뜨리는 주요 요인이다.(불필요한 복사 생성자 호출로 인한 오버헤드) 이런것들이 어떤 것들이 있는지 알아보자 예제 코드~ #include #include /* 아마도 이런 녀석이 있어야 겠다. operator== 도 만들어야겠고 말이다. 왜 addr을 public 으로 했는지는 스스로 판단 하길..*/ class Employee { public: bool operator==( const std::string& rhs ) const { return addr == rhs; } public: std::string addr; }; // 이건 내가봐도 촤악의 함수다. std::string FindAdd..
진행 노트는 책을 보도록 하고, 다음은 항목 4의 해결책으로 제시된 클래스이다. template class fixed_vector { public: typedef T* iterator; typedef const T* const_iterator; iterator begin( ) { return v_; } iterator end( ) { return v_+ size; } const_iterator begin( ) const { return v_; } const_iterator end( ) const { return v_ + size; } // 기본생성자 fixed_vector() { } // 복사 생성자 template fixed_vector( const fixed_vector& other ) { std::..
최근댓글