boost

You are currently browsing articles tagged boost.

C++ 의 모든 base class 의 destructor 는 꼭 virtual 이어야 할까요?

당연한 이야기지만 정답은  “아니다.” 입니다.

polymorphic base class 의 경우는 그래야겠지만 단순히 base class 라면 꼭 그럴 필요는 없습니다. 일단 non-virtual destructor 가 문제되는 경우가 하위 클래스의 인스턴스를 상위 클래스로 업캐스팅 해서 사용하다가 삭제하는 경우이므로 이런 경우가 발생하지 않는다면 문제가 없다는 이야기입니다.

예를 들면 boostnoncopyable 등의 클래스를 상속한 하위 클래스에서 noncopyable 로 업캐스팅해서 사용하다가 delete 하는 경우는 상상하기 어렵겠죠? 따라서 이런 클래스들은 소멸자가 가상 함수가 아닙니다.

물론 그럴리가 없다고 생각하는 경우라도 혹시나 다른 프로그래머가 그렇게 할지도 모른다는 염려가 든다면 아래와 같이 작성해주면 됩니다.

class BaseClassNotPolymorphic
{
  protected:
    ~BaseClassNotPolymorphic() {}
};

이렇게 base class 의 destructor 를 protected 로 설정해두면 이 클래스의 포인터로 delete 등을 시도할 때 컴파일 타임 에러가 발생하므로 문제를 미연에 방지할 수 있습니다. :) 그리고 실제로 boost 의 noncopyable 클래스의 경우 생성자와 소멸자가 전부 protected 입니다.

Tags: , ,

다툴래? 나와 갈등을 빚어볼래? 급의 제목인거 같지만[..] 여튼 오늘 심심해서 코딩해보다가 다시금 STL(Standard Template Library) 에 조금 실망하게 되는 점(?)이 있어서 글을 써봅니다. 우선 평상시에는 boost 를 거의 상용하기 때문에 이런 불편함을 못느꼈었는데 STL 만 사용하는 경우 가끔씩 이런 불편함을 느끼게 되네요.

사건의 발단(?)은 오늘 누군가 인터넷 게시판에 “정수 10개를 입력 받아서 홀수와 짝수를 구분하여 각각 출력”하는 문제의 소스 코드를 디버깅 해달라고 올린걸 본 것부터였습니다. 간단한 문제니까 한번 C++ 의 표준 라이브러리와 STL 가지고 짜볼까? 하는 생각이 들어서 짜보게 되었는데 그게 재앙의 시작일 줄은 그때는 미처 몰랐습니다[..]

평소에 주로 SGI 의 STL 문서를 보기 때문에 당연히 입력은 copy_n 으로 받고 홀짝 구분은 partition 과 compose1, bind2nd, equal_to, modulus 로 만들 생각이었습니다.

자, 문제 조건이 정수 10 개를 입력받는 거니까. 우선 정수 10 개를 입력 받아서 벡터로 복사해볼까?

vector<int> input;
copy_n(istream_iterator<int>(cin), 10, back_inserter(input));

… 컴파일 중 …

어라? 컴파일이 되지 않습니다?!
Read the rest of this entry »

Tags: , , ,