C++

You are currently browsing articles tagged C++.

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 같은 표준 라이브러리나 기타 여러 라이브러리들을 사용할 때 저도 그렇고 누구에게나 드는 의문일 거 같기 때문에 그에 대해 간단하게 저의 생각을 적어봤습니다.

“홀짝도 구분 못하는 STL 에서 볼 수 있듯이 C++ Standard Template Library 의 경우 표현력과 재사용성을 서로 trade-off 했기 때문에 STL 로만 코드를 짜는데는 표현력에 많은 제한이 있습니다. 제가 불평한 것도 그런 표현력이 몇가지 부분에 있어서 많이 부족했기 때문입니다. 하지만 오히려 그 덕분에 STL 로만 작성할 수 있는 경우에 그 코드의 가독성과 논리적 명확성은 오히려 더욱 뚜렷해진다고 생각합니다. 반면 아무런 라이브러리도 사용하지 않은, 언어 자체의 expression 과 statement 를 사용한 코드의 경우 그 표현에 있어서 제한이 없으니 더 쉬운 코드나 아니면 이해할 수 없을 정도로 복잡 다단한 코드도 나올 수 있을 겁니다. 따라서 저는 단순히 STL 사용 여부가 코드의 복잡성이나 가독성을 높이거나 낮춘다고 생각하지는 않습니다.

Read the rest of this entry »

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: , , ,

« Older entries