템플릿 인스턴스화 시점이 템플릿 매개변수를 넘겨서, 그 템플릿이 사용 되어질 때라고 정리 했었다. 그렇다면 "매개변수"란? 도데체 무엇일까? 일반 함수의 매개변수는 매개변수 타입의 값이다. 그렇다면 템플릿 매개변수의 타입은 무엇이 있을까? 두가지로 정할 수 있는데, 한가지가 바로 C++에서 타입으로 인정되는 것이 매개변수 타입 중 1개 이고, 컴파일 타임에 인식 될수 있는 상수형 값 이 마지막 타입이 된다. 정리 하자면, 1. C++ 에서 인정되는 타입 2. C++ 에서 컴파일 타임에 인식되는 값 이 두가지가 템플릿 매개변수가 된다. C++ 에서 타입으로 인정 되는게 무엇일까? int, unsinged int 등등등 기본 타이과 사용자 타입, 그리고 템플릿 타입이 있다. 템플릿 타입은 역시 템플릿이 사용..
책 정리 검색 결과
템플릿 정의하기에서 정의하는 방법을 정리했다. 정리 되는 도중에 한가지 의문점이 생기는데, 그 의문점은 "도데체 언제 템플릿들이 코드화가 이루어 지는 것일까?" 이다. 당연한 이야기 겠지만, 컴파일러에 의해서 링크가 되기 전에 이루어 질 것이지만, 정확한 시점을 모르면 약간 어리 둥절할 때가 있기 떄문이다. 이 어리둥절함은 컴파일 타임이라는게 전처리기 타임이라는 것도 있고 이진코드 생성 타임도 있고, 문법 검사 타임도 있고, .. 여러 타임이 나누어져 있기 때문에, 템플릿 인스턴스화의 시점에 따라서 템플릿 코드가 달라 질 수 있어, 어리 둥절 하게 된다. 그렇다면, "템플릿 인스턴스화" 란 무엇인가? 템플릿 매개변수에 인자를 넘겨서 클래스 선언을 만드는 과정을 "템플릿 인스턴스화" 라고 한다. 이런 인스..
파트 2에선 함수 템플릿을 알아 봤다면, 이제 클래스 템플릿을 알아보자, 클래스 템플릿은 메타 프로그래밍에서 본다면 특별한 녀석이니, 꼭 짚고 넘어가야 한다.(여기서 왜 특별한지는 이야기 하지 않는다 : ) ) 클래스 템플릿( class template )라 해도 일반 클래스와 다를게 없다. 클래스 템플릿을 만들기 전에 우선 일반 클래스로 만들어서 테스트를 해 보고, 템플릿 화를 시키는게 더 편하기까지 하니, 정말 차이가 없다는 것을 알 것이다. 클래스 템플릿 정의하기 #include template // or template class class_template { public: ~class_template( ) { } class_template( char a ) : a_ ( a ) { } public..
이게 난이도 6 인가, : ) 한 8쯤 되는줄 알았는데, 더 정진해야겠다. 이번 항목을 클래스안에서 적용 될 것을 계산하여 스마트 포인터를 만들어 보는 항목이다. 알다 시피 클래스 안에서 스마트 포인터를 사용 할 때는 다음 4가지 경우를 반드시 생각해 봐야 한다. 첫째, 클래스의 생성자에서 어떻게 작동 하게 할 것인가? 둘째, 클래스의 소멸자에서 어떻게 작동 하게 할 것인가? 셋째, 클래스의 복사 생성자에서 어떻게 작동 하게 할 것인가? 넷째, 클래스의 복사 할당자에서 어떻게 작동 하게 할 것인가? 이번 항목은 이렇게 질문 4개에 대한 답변들로 이루어 졌다. 일전에 babo_ptr을 제작해보았던 터라 이 문제에 대해서 생각하여, 그 대처 방안으로 썼었는데, 다시 정리 하려 하니 귀찮다. 왜냐하면 결론을 ..
알다 시피 C++ 프로그래머에게 있어, 클래스의 멤버가 pointer 일 경우 각별한 주의가 필요로 한다는 것은 알 것이다. 그렇다면, 영리한 포인터 녀석들을 넣을 경우, 생길 수 있는 문제점을 알고 있는가? 이번 항목은 그런 문제에 대해서 이야기 하고 생각해 보는 시간을 갖기 위해 존재 한다. 질문 1. 다음 코드가 매우 불안한 이유는? class X1 { ~X1() { delete p_ } X1( int * p ) p_( p ) { } // 컴파일러가 만들어 주는 복사 생성자와 // 복사 할당자를 이용 한다. private: int *p_; }; 단번에 알겠지만, 메모리 누수가 일어 나거나, 두번 릴리즈 하게 된다. 질문 2. 그렇다면 스마트 포인터를 사용 한다면, 어떤 문제가 있을까? class X..
std::auto_ptr 에 대한 이야기이다. 이것은 표준에 있는 스마트 포인터 이기 때문에, 스마트 포인터의 대표격이다. 물론 C++ 0x 에선 shared_ptr 이 .. 대표로 갈아치우지 않을까 한다. : ) 질문 1. auto_ptr을 잘못 사용 하고 있는 코드이다. 한번 찾아 보아라. template void f( size_t n ) { auto_ptr p1( new T ); auto_ptr p2( new T[n] ); // .. 할일 있으면 더 한다. } 질문 1은 바로 답을 말하면, 배열을 담았다는 데에 있다. auto_ptr 은 배열을 담는다 해도 delete[] 를 호출해 주지 않기 때문에 문제이다. 질문 2. 이 문제를 어떻게 해결할 것이며, 어댑터 패턴이나 생성 작업의 문제점과 aut..
최근댓글