일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 stl
- 비교 함수 객체
- 게임
- virtual function
- 함수 객체
- 반복자
- implicit conversion
- 암시적 변환
- resource management class
- 상속
- 루아
- exception
- 영화
- 영화 리뷰
- UE4
- 티스토리챌린지
- Smart Pointer
- c++
- 예외
- 언리얼
- reference
- 스마트 포인터
- Effective c++
- 오블완
- 다형성
- operator new
- 참조자
- 메타테이블
- more effective c++
- Today
- Total
목록개발 (181)
스토리텔링 개발자
항목 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(); // 모호성 발생!위에서 확인할 수 있듯, 파생 클래..
항목 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..
항목 37. 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자 기본 매개변수 값을 재정의할 시 문제 상황class Shape{public: enum ShapeColor { Red, Green, Blue }; virtual void draw(ShapeColor color = Red) const = 0; ...};class Rectangle : public Shape{public: virtual void draw(ShapeColor color = Green) const; // 기본 매개변수 재정의!!! ...};Shape* ps;Shape* pr = new Rectangle;pr->darw(); // Rectangle::draw(Shape::Red..
항목 36. 상속받은 비가상 함수를 파생클래스에서 재정의하는 것은 금물 비가상 함수를 가리면 생기는 문제class B{public: void mf(); ...};class D : public B{public: void mf(); // B::mf를 가려버린다! ...};D x; // D 타입B* pB = &x; // x에 대한 포인터를 B*에 넣는다.D* pD = &x; // x에 대한 포인터를 D*에 넣는다.pB->mf(); // B::mf를 호출pD->mf(); // D::mf를 호출!!!!비가상 함수를 가려버리면, 포인터가 어디에 담겨있느냐에 따라 다르게 동작한다.가상 함수 및 오버라이드를 사용했을 경우 발생하지 않는 문제이다. 문제 동작 이유비가상 함수는 정적 바인딩으로 ..