이전 항목(15)에서 T의 요구사항 중 한가지인 소멸자에서 예외를 발생시키지 않아야 한다고 이야기 했던것을 기억 한다면, 왜 소멸자에서 예외를 발생 시키면 안되는지에 대해서 풀어 보도록 하자. 한가지 전제를 하여 T *p = new T[10]; delete[] p; 위의 코드드 중 소멸자에서 예외가 발생 된다면, 어떤 문제점이 발생 할 수 있을까? 첫번째, 만약 생성은 모두 성공하고 delete[] 처리 중 5번째꺼에서 파괴가 된다면 어떻게 될까? 5번째부터 10번째꺼는 파괴 불가능한 상태 되는 문제가 남는다. 이것은 p[0] 가 파괴 되었기 때문에 다시 delete[] p; 를 할 수 없기 때문이다. 두번째, 만약 생성 도중 예외가 발생하여, T의 소멸자를 호출해야 할 때, 예외가 발생 한다면, 어떻게..
Stack 검색 결과
이번 항목은 저번 13항목, 14항목에서 만들어보았던 private 기반 상속과 HAS-A 기반 관계에 대해 비교해 보는 항목이다. StackImple을 private 기반 클래스나 멤버 개체로 사용하는 것 중에 어느 기법이 더 좋은가? Stack의 두 버전은 얼마나 재사용 가능한가? 내재된 데이터형인 T의 요구사항은 무엇인가? Stack은 함수에 대한 예외 규격을 제공해야 하나? 생각해 보자. 1. private 상속이 좋은가? HAS-A 관계가 좋은가? 왜 이런 비교를 하는고 하면, 두 상속 모두 "구현 상속" 이라는 명제가 깔리기 때문이다. 클래스 기반 상속은 HAS-A 기반 관계 보다 더 관계를 맺는다.. 마치 머리에 붙은 껌 같이 강력하다. 그렇기 때문에 대부분의 사람들은 HAS-A 관계으로도 ..
예제코드 template class StackImpl { /* ? ? ? ? ? */ StackImpl( size_t size = 0 ); ~StackImpl(); void swap( StackImpl& other ) throw(); T* v_; size_t vsize_; size_t vused_; private: // private and undefined: 복사가 허용되지 않음 StackImpl( const StackImpl& ); StackImpl& operator=( const StackImpl& ); }; template class Stack : private StackImpl { public: Stack( size_t size = 0 ); ~Stack(); Stack( const Stack& ..
Container adaptors: stack LIFO stack (class template) queue FIFO queue (class template) priority_queue Priority queue (class template) 이런 컨테이너가 있는지도 몰랐다. vector 와 deque 만 줄기차게 사용했었는데, 정확한 목적에 정확한 컨테이너를 사용하면 아주 조금이나마 성능이 좋아 진다.(.. 비교해 보았으나 조금 빨라 질뿐.. ㅋ) stack 은 맨 마지막에 적재한것을 먼저 뺄수 있다. LIFO queue 는 처음에 적재한것을 먼저 뺄 수 있다. FIFO priority_queue 는 정렬된 순으로 적재되고, 뽑을수 있다.
최근댓글