진행 노트는 책을 보도록 하고, 다음은 항목 4의 해결책으로 제시된 클래스이다.

분석
우선, 컴파일러가 기본적으로 제공해주는 복사 생성자와 복사 할당자가 있음에도 불과하고 왜 템플릿 복사 생성자와 복사 할당자를 써야만 했는지 설명한다.

정확하게 말해서 이 코드는 절대로 복사 생성자나 복사 할당자가 아니다. 왜냐하면, 이 복사 생성자와 복사 할당자는 템플릿 매개변수를 가진 다른 복사 생성자와 복사 할당자가 유동적으로 생성이 되어, 처리가 되기 때문에, 기본 복사 생성자와 기본 복사 할당자라 할수가 없다. 기본 복사 생성자와 할당자는 내가 항목 4에서 제시한 복사 생성자와 할당자 이다.

그리고 컴파일러가 완전히 같은 복사 생성자와 복사 할당자를 자동으로 만들어 주므로 템플릿 복사 생성자와 복사 할당자는 이것들의 오버로드가 되는 것이다. 왜 이렇게 템플릿으로 만들었는지는 다음 코드로 증명 된다.


라인 3에서, 컴파일러에 의새 생성된 진짜 복사 생성자가 호출 되어 처리 된다. 하지만 라인 5에선, 템플릿 복사 생성자가 호출되어 처리 된다. 같은 의미로 라인 6에선 진짜 복사 할당자가 호출되어 처리되고 7번째 라인에선 템플릿 복사 할당자가 호출되어 처리 된다.

이제 이해가 가지 않는가? 왜 템플릿 복사 할당자와 복사 생성자로 만들었지 말이다. 그렇다. 좀더 유연하고 확장성을 가지는 fixed_vector 를 구사할수 있기 때문에, 주제와 딱 맞아 떨어지는 .. 재사용이 가능해 진다.

 

그리고 유용성에 대하여 중요한 문제를 지적한다. 다음 코드를 보자.


즉 1, 2번의 사용자 편의에 맞게 복사 생성자 및 복사 할당자가 지원되어야 한다는 것이다.  뭐 위에서 말했던 템플릿 복사 생성자와 할당자로 지원이야 되지만, 몬가 .. 그 사용법에 대해서 부족하다고 말한다. 즉 다음코드 추가 함으로써, 좀 더 세부적인 복사 할당자를 지원하면 좋겠다고 한다.

이 코드는 다음과 같은 이식성을 제공해 준다.

할당 연산자에 대해서도 똑같은 식으로 하면 된다. 여기서 잠깐, 책에서 설명한것이 위험한 부분이 포함되어 있어 집고 넘어 간다.


이 코드에서 문제점이 분명이 있다. 바로 w의 길이가 v의 길이보다 짦을 경우이다. 물론 .. +4로 써줌으로써 .. 해결하고 있지만 범위를 지정하는것에 있어서, 좀 위험스럽다. 아.. 왜 operator= 에서 복사 생성자 처럼 하지 못하냐면(범위 지정) operator= 은 .. 1개의 매개변수만 갖기 때문이다.

그리고 마지막으로 내가 생각해봤었던 예외 안전적인 것에 대해서 마지막으로 언급을 하자면, .. fixed_vector 가 배열을 가지는게 아닌 포인터를 가리키는것으로 디자인을 바꾸는게 좋다고 한다.(코드가 길고 귀찮아서..)

총평
..많은 것을 배웠다. 템플릿 컨테이너나 템플릿 클래스의 경우 복사 생성자와 복사 할당자에 대해서, 템플릿으로 만들시 보다 유연한 템플릿 클래스가 된다는 것을(.. 사실 Effective C++ 에서 나왔었지만 까먹었다. ... ) 그리고, 클래스 설계 당시 예외안전성도 같이 디자인을 해야 뒤에 가서 코드 고치기가 쉽다는 것, 사용자 입장에서 사용의 폭을 넒혀야 한다는것을 배웠다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기