일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- lua
- 예외
- Effective c++
- effective stl
- reference
- implicit conversion
- 상속
- Vector
- virtual function
- 반복자
- 다형성
- more effective c++
- resource management class
- 메타테이블
- 스마트 포인터
- 언리얼
- 영화 리뷰
- 암시적 변환
- Smart Pointer
- exception
- 루아
- 참조자
- 영화
- 비교 함수 객체
- 게임
- operator new
- 티스토리챌린지
- c++
- 오블완
- UE4
- Today
- Total
목록Effective c++ (54)
스토리텔링 개발자
항목 47. 타입에 대한 정보가 필요하다면 특성 정보 클래스를 사용하자 STL의 구성컨테이너(container) 템플릿반복자(iterator) 템플릿알고리즘(algorithm) 템플릿유틸리티(utility) 템플릿지정된 반복자를 지정된 거리(distance)만큼 이동시킨다.// iter를 d 단위만큼 양수면 전진, 음수면 후진 시킨다.templatcevoid advance(IterT& iter, DistT d);그냥 iter += d 만 하면 될 것 같지만..모든 반복자를 지원해야 할텐데....+= 연산자를 지원하는 반복자는 임의 접근 반복자밖에 없다. STL 반복자의 종류입력 반복자(input iterator)전진만 가능하다.한번에 한 칸씩만 이동한다.자신이 가리키는 위치에서 읽기만 가능하다.읽..
항목 46. 타입 변환이 바람직할 경우에는 비멤버 함수를 클래스 템플릿 안에 정의해 두자 선행 사항 : 우선 '모든 매개변수에 대해 암시적 타입 변환을 지원하려면 비멤버 함수밖에 방법이 없다'를 숙지하는 것이 좋다.(항목 24 참조) Rational 클래스의 operator* 함수를 템플릿으로 만들어보자templateclass Rational{public: Rational(const T& numerator = 0, const T& denominator = 1); const T numerator() const; const T denominator() const; ...};// operator* 템플릿 비멤버 함수templateconst Rational operator*(..
항목 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& ..
항목 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(); // 모호성 발생!위에서 확인할 수 있듯, 파생 클래..