일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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++
- virtual function
- 반복자
- 참조자
- 영화
- UE4
- resource management class
- 게임
- 비교 함수 객체
- c++
- 다형성
- 언리얼
- 상속
- 오블완
- 영화 리뷰
- implicit conversion
- 루아
- operator new
- 암시적 변환
- 티스토리챌린지
- 스마트 포인터
- 예외
- effective stl
- reference
- more effective c++
- exception
- Smart Pointer
- 메타테이블
- Vector
- Today
- Total
목록개발/Effective C++ (55)
스토리텔링 개발자
항목 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를 호출!!!!비가상 함수를 가려버리면, 포인터가 어디에 담겨있느냐에 따라 다르게 동작한다.가상 함수 및 오버라이드를 사용했을 경우 발생하지 않는 문제이다. 문제 동작 이유비가상 함수는 정적 바인딩으로 ..
항목 35. 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러두자. 가상 함수 버전class GameCharacter{public: virtual int healthValue() const; // 캐릭터의 체력 가상 함수 ...};가상 함수 외의 방법으로 구현할 수는 없을까? 비가상 인터페이스(NVI) 관용구를 통한 템플릿 메서드 패턴class GameCharacter{public: int healthValue() const // 비가상 인터페이스 { ... int retVal = doHealthValue(); ... return retVal; } ...private: virtual int doHe..
항목 34 : 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자 상속이 가지는 두 가지 의미함수 인터페이스를 상속한다.함수 구현을 상속한다.이 두 가지 의미를 잘 헤아려서 사용해야 한다.이에 대해 아래 예제를 통해 알아본다. 추상 클래스와 상속// 추상 클래스class Shape{public: virtual void draw() const = 0; // 순수 가상 함수 virtual void error(const string& msg); // 단순 가상 함수 int objectID() const; // 비가상 함수 ...};// 파생 클래스들class Rectangle : public Shape { ... };class Ellipse : public Shape {..
항목 33. 상속된 이름을 숨기는 일은 피하자 상속과 유효범위상속 역시 유효범위로 취급한다.유효범위 내에서 이름을 찾지 못하면 상위 유효범위를 탐색한다. C++ 이름 가리기 규칙c++의 이름 가리기 규칙은 단지 이름만으로 유효범위를 탐색하고, 가려버린다.그렇기에 아래와 같은 문제가 발생할 수 있다. class Base{private: int x;public virtual void mf1() = 0; virtual void mf1(int); virtual void mf2(); void mf3(); void mf3(double); ...};class Derived : public Base{public: virtual void mf1(); ..
항목 32. public 상속 모형은 반드시 “is-a(...는 ...의 일종이다)”를 따르도록 만들자 public 상속의 의미자식 클래스의 모든 객체는 부모 클래스 객체지만, 부모 클래스 객체는 자식 클래스 객체가 아니다.D(Derived) is a B(Base)이지만, B는 D의 일종이 아니다. public 상속의 예 : 새 클래스와 팽귄 클래스직관적으로 만들다 보면 모호한 경우가 생긴다.방식 1. 펭귄을 새의 자식으로 만들었을 때class Bird{public: virtual void fly(); ...};class Penguin : public Bird{ // 펭귄 역시 새지만, // fly()를 지원하는 것이 맞는가? ...}l보완하면 다음과 같이 할 수 있을 ..