본문 바로가기

NC University37

1일차 - thiscall Intro  예전 Advanced C++ 수업에서 일반 함수 포인터와 (클래스의) 멤버 함수 포인터의 차이점, 그리고 멤버 함수의 호출원리에 대해 배웠었다. 자세한 것은 예전 정리글을 참고하고, 여기서는 이것이 클래스 디자인에 어떻게 영향을 줄 수 있는지를 중점적으로 정리한다.Review - member function pointer  멤버 함수 포인터와 관련된 내용을 간단히 요약하면 다음과 같다.  비정적(non-static) 멤버 함수는 실제로는 this 포인터를 첫번째 인자로 받기때문에 일반적인 함수 포인터로는 멤버 함수의 주소를 담을 수 없다는 것이었다. 반면에 정적(static) 멤버 함수는 this 포인터를 인자로 가지지 않기 때문에 일반 함수 포인터에 주소를 담는 것이 가능하다.class D.. 2016. 5. 19.
6일차 - 단위전략 기반의 클래스 디자인 Intro  아래는 간단한 List 클래스의 일부와 이 클래스를 사용하는 코드이다. 다음의 코드에서 문제점이 무엇인지를 생각해보자.#include using namespace std;template class List{public: void push_front (const T& a) { // do something (no synchronization) } // other merber functions and variables};List g_list; //  위의 코드에서 g_list는 전역변수이므로 다중 스레드 환경에서는 thread-safe 하지 않다. 이를 보완하기 위해 push_front 함수에 동기화 코드를 추가시키는 것이 좋아 보일 수 있다. 하지만 이러한 .. 2015. 11. 24.
6일차 - thin template Intro  임의의 타입 객체들을 저장하는 단순한 컨테이너를 구현해보자. 이 컨테이너의 기능은 컨테이너의 맨 앞에 객체를 추가하거나, 컨테이너에 저장된 첫 element를 얻어오는 것으로 충분하다. 또한, 컨테이너의 현재 상태(state)를 보여주는 함수 2개(size, empty)도 함께 포함시키자. 이러한 요구사항을 만족시키는 컨테이너의 선언은 아래의 코드와 같은 형태가 될 것이다.template class Container{public: int size () const; bool empty () const; void push_front (const T& a); T& front ();private: T* buffer_; int size_;};  이제 위의 Con.. 2015. 11. 4.
6일차 - CRTP (Curiosly Recurring Template Pattern) Intro  아래 코드의 수행결과를 예상해보자.#include using namespace std;class Window {public: void MessageLoop () { OnClick(); } void OnClick () { cout   예전 글에서 Window 클래스의 멤버함수인 MessageLoop가 개념상으로는 아래 코드와 동일함을 언급했었다. 그리고 OnClick 함수는 비가상(non-virtual) 함수이기 때문에 MessageLoop 함수를 통해 호출되는 함수는 (2)가 아니라 (1)이다.void MessageLoop (Window* const this) { this->OnClick(); }   원래의 의도대로 동작하게 하려면 가장 간단하게는 OnClick 함수를 가상함수로 .. 2015. 10. 30.