일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 메타테이블
- 다형성
- 예외
- virtual function
- 언리얼
- Smart Pointer
- resource management class
- 상속
- 티스토리챌린지
- Effective c++
- operator new
- 반복자
- 영화 리뷰
- 오블완
- 암시적 변환
- 참조자
- 스마트 포인터
- 게임
- effective stl
- 함수 객체
- reference
- 영화
- 비교 함수 객체
- effective modern c++
- lua
- implicit conversion
- UE4
- exception
- more effective c++
- c++
- Today
- Total
목록분류 전체보기 (205)
스토리텔링 개발자
항목 45. “호환되는 모든 타입”을 받아들이는데는 멤버 함수 템플릿이 직방! 포인터의 암시적 변환(implicit conversion)스마트 포인터로는 대신할 수 없는 포인터의 특징이다.// 포인터의 경우class Top { ... };class Middle : public Top { ... };class Bottom : public Middle { ... };Top* pt1 = new Middle; // Middle* -> Top* 암시적 변환Top* pt2 = new Bottom; // Bottom* -> Top* 암시적 변환const Top* pct2 = pt1; // Top* -> const Top* 암시적 변환// 사용자 정의 스마트 포인터의 경우templateclass SmartPtr{p..
항목 44. 매개변수에 독립적인 코드는 템플릿으로부터 분리시키자 템플릿의 장단점장점코딩 시간 절약코드 중복 회피단점코드 비대화거의 똑같은 내용의 코드와 데이터가 중복되어 이진파일로 구워진다. 템플릿 코드 비대화 회피 방법공통성 및 가변성 분석(commonality and variability analysis)공통 부분을 별도의 클래스로 옮긴 후 클래스 상속 혹은 객체 합성으로 공유한다.이미 이런 분석을 항상 사용해 왔을 것이며, 템플릿에도 똑같이 적용하여 코드 중복을 막으면 된다.하지만... 템플릿은 코드 중복이 암시적이라 감각적으로 알아차리는 수밖에 없다. 템플릿 코드 비대화 해결법을 코드로 알아보자templateclass SquareMatrix // 정방행렬{public: ... ..
항목 43. 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아두자 템플릿 클래스에서 생길 수 있는 문제class CompanyA{public: void sendCleartext(const string& msg); void sendEncrypted(const string& msg); ...};class CompanyB{public: void sendCleartext(const string& msg); void sendEncrypted(const string& msg); ...};class MsgInfo { ... };// 템플릿 기본 클래스templateclass MsgSender{public: void sendClear(const MsgInfo& ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bJbSzV/btsIwPahF0I/qBhgDCg40ZbWckmkpPMXk1/img.png)
항목 42 : typename의 두 가지 의미를 제대로 파악하자 템플릿에서 class와 typename의 차이template class Widget; // class 키워드를 사용한다.template class Widget; // typename 키워드를 사용한다.이 경우 이 둘은 사실상 완전히 같은 의미를 가진다.하지만 typename을 쓰지 않으면 안 되는 경우가 있다. 템플릿 안에서 참조할 수 있는 두 종류의 이름// 컨테이너의 두 번째 원소를 출력한다.// 하지만 문제가 있는 코드!!tmeplatevoid print2nd(const C& container){ if(container.size() >= 2) { C::const_iterator iter(container...
항목 41. 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터 객체 지향 프로그래밍의 축명시적 인터페이스(explicit interface)명시적으로 적시된 인터페이스를 통해 객체를 활용할 수 있다.런타임 다형성(runtime polymorphism)런타임에 객체의 타입을 유동적으로 체크한다.class Widget{public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); void swap(Widget& other); ...};void doProcessing(Widget& w){ if(w.size() > 10 && w != som..
항목 40 : 다중 상속은 심사숙고해서 사용하자 다중 상속(multiple inheritance : MI)의 문제둘 이상의 기본 클래스로부터 똑같은 이름을 물려받을 가능성이 생긴다.class BorrowableItem{public: void checkOut(); ...};class ElectronicGadget{private: bool checkOut() const; ...};// 이런 다중 상속의 경우 어떻게 될 것인가?class MP3Player : public BorrowableItem, public ElectronicGadget{ ... };MP3Player mp;mp.checkOut(); // 모호성 발생!위에서 확인할 수 있듯, 파생 클래..
항목 39. private 상속은 심사숙고해서 구사하자 private 상속의 동작public 상속과 달리, 컴파일러는 일반적으로 파생클래스 객체를 기본클래스 객체로 변환하지 않는다.즉, 기본 클래스를 매개변수로 받는 함수를 파생 클래스 객체로 호출할 수 없다는 의미이다.기본 클래스에서 물려받은 멤버는 파생 클래스에서 모조리 private 멤버가 된다.즉, 기본 클래스의 public,. protected 멤버는 파생 클래스에서 private 멤버가 된다. private 상속의 의미is implemented in terms of (...는 ...를 써서 구현된다.)즉 private 상속은 그 자체로 구현 기법 중의 하나라고 할 수 있다.구현만 물려받을 수 있고 인터페이스는 물려받을 수 없다.소프트웨어..
항목 38 : “has a(~는 ~를 가짐)” 혹은 “is implemented in terms of(~는 ~를 써서 구현됨)”를 모형화할 때는 객체 합성을 사용하자. 합성(composition)객체가 다른 타입의 객체를 포함하고 있을 경우 성립하는 타입들 사이의 관계레이어링(layering), 포함(containment), 통합(aggregation), 내장(embedding) 등으로도 불린다.class Address { ... };class PhoneNumber { ... };class Person{public: ...private: // 아래 객체들은 Person 객체와 합성 관계이다. string name; Address address; PhoneNumber voic..