본문 바로가기

NC University/Advanced C++34

6일차 - CRTP (Curiosly Recurring Template Pattern) Intro 아래 코드의 수행결과를 예상해보자. #include using namespace std; class Window { public: void MessageLoop () { OnClick(); } void OnClick () { cout 2015. 10. 30.
6일차 - checked delete Intro 일반적으로 헤더 파일 등에서 다른 유저 정의 타입 A의 포인터 변수만 사용되는 경우에는 아래와 같이 타입 A를 전방선언해서 사용한다. 이처럼 완전한 선언없이 전방선언만 존재하는 타입의 포인터를 불완전 객체(incomplete object)라고 한다.class Test; //< 클래스의 전방선언 Test* p; //< 불완전 객체 불완전 객체는 타입에 대한 정보가 전혀 없기 때문에 delete 시에 객체의 소멸자가 호출되지 않는다는 문제점이 있다. 다음의 코드를 통해서 이러한 상황을 확인해보자.#include using namespace std; class Test; //< 전방선언 void foo (Test* p) { delete p; } class Test { public: Test () {.. 2015. 10. 21.
5일차 - move semantics Intro 포인터를 멤버변수로 가지는 간단한 클래스 하나를 생각해보자. class Cat final { public: Cat (const char* name, int age); Cat (const Cat& rhs); ~Cat (); const char* name () const { return name_; } int age () const { return age_; } private: char* name_; int age_; }; 보통 위와 같이 포인터를 멤버로 가지는 클래스는 복사 생성자에서 깊은 복사(deep copy)를 수행한다. (이하로 이를 일반 복사 생성자라고 칭함) 생성자 내에서의 깊은 복사는 원래 객체의 변경없이 원래 객체와는 완벽하게 독립적인 복사본을 만들어낸다. 하지만 메모리 할당을 수.. 2015. 9. 14.
5일차 - 완벽한 전달자 (perfect forwarding) (2) Intro 이전 글에서 다루었던 우측값(rvalue)은 주로 두가지로 활용된다. 하나는 완벽한 전달자이고, 다른 하나는 move semantics이다. 이번 글에서는 첫번째 항목인 완벽한 전달자를 만드는 것에 초점을 맞추고자 한다. 우선 예전에 완벽한 전달자 (1)에서 다뤘던 lockAndCall 예제를 다시 살펴보자. #include using namespace std; void foo (int a) {} void goo (int& a) { a = 0; } // 함수 오버로딩을 사용한 perfect forwarding template void lockAndCall (F f, A& a) { f(a); } template void lockAndCall (F f, const A& a) { f(a); } in.. 2015. 9. 6.