본문 바로가기

이론31

[항목44]매개변수에 독립적인 코드는 템플릿으로부터 분리시키자 템플릿을 사용하면 생김새나 하는 일이 비슷한 클래스의 코드를 일일이 작성해주지 않아도 된다.* 몰랐던 내용인데 클래스 템플릿의 멤버 함수는 실제로 사용될 때에만 암시적으로 인스턴스화 된다고 한다.(나는 클래스가 인스턴스화될 때 들고있는 모든 멤버함수들도 인스턴스화 되는 줄 알고 있었다...) 하지만 이 템플릿도 아무 생각 없이 사용하다가는 템플릿의 적 코드 비대화(code bloat)를 초래 할 수 있다.고정 크기의 정방행렬을 나타내는 클래스 템플릿으로 위 설명의 예를 보여드리겠습니다. templateclass SquareMatrix {public: void invert(); //주어진 행렬을 역행렬로 만드는 함수} 위으 SquareMatrix 템플릿 클래스는 T라는 타입 매개변수와 size_t라는 비타.. 2017. 12. 26.
[항목43]템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자 template class MsgSender{public: void sendClear(const MsgInfo& info) { 동작... }} templateclass LoggingMsgSender : public MsgSender{public: void sendClearMsg(const MsgInfo& info) { sendClear(info); }} 위의 코드는 컴파일되지 않는다.그 이유는 LoggingMsgSender 클래스가 컴파일될 때 Base클래스인 MsgSender의 템플릿 매개변수가 어떤 것인지 모르기 때문에(LoggingMsgSender가 인스턴스로 만들어 질 때까지 무엇인지 알 수 없다) MsgSender 클래스가 어떤 형태인지 알 수 없어서 sendClear 함수가 들어 있는지 없는지.. 2017. 12. 25.
[2장]ASSERT YOURSELF strCopy = memcpy(malloc(length), str, length);위와 같은 코드에서 새로운 메모리릉 할당하는 malloc 함수가 실패한다면 memcpy 함수에 NULL포인터를 전달하게 되면서 memcpy는 정상적인 작동이 불가능하다. 따라서 예외 처리를 한다면 memcpy함수에 아래와 같이 예외처리를 추가 해 줄 수 있다.void memcpy(void* dst, void* src, size_t size) { if( dest == NULL || src == NULL) { // 에러 발생 } //~~ 복사 처리 //}위와 같이 코드를 작성하면 NULL포인터 문제를 막을 수 있다. 하지만 코드량이 늘어나고 수행해야할 코드가 늘면서 속도가 저하게되게 된다. 따라서 상업용 프로그램을 개발할 때는.. 2017. 2. 12.
[1장]가상 컴파일러 컴파일 단계에서 소스코드의 버그를 잡아 줄 수 있다면 버그 없는 프로그램을 작성하는데 큰 도움이 될 것이다. 따라서 코드 상에서 가상 컴파일러를 흉내 내도록 노력해서 버그를 자동으로 발견할 수 있는 모든 기회를 이용하자. 흔히 자주 틀리는 구문이지만 이 구문이 프로그래머가 의도한 것일 수도 있는 구문일 경우 컴파일러에서는 에러로 표시하는 구문이 있다. ex) int count = 0; while( count < 5 ); 2017. 2. 4.