일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 비교 함수 객체
- 다형성
- virtual function
- 영화 리뷰
- 암시적 변환
- lua
- implicit conversion
- 영화
- 메타테이블
- 예외
- exception
- reference
- effective stl
- 함수 객체
- 루아
- more effective c++
- 상속
- Effective c++
- 반복자
- 참조자
- resource management class
- 스마트 포인터
- 언리얼
- Smart Pointer
- operator new
- 티스토리챌린지
- 게임
- 오블완
- UE4
- c++
- Today
- Total
목록개발 (181)
스토리텔링 개발자
항목 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보완하면 다음과 같이 할 수 있을 ..
항목 31 : 파일 사이의 컴파일 의존성을 최대로 줄이자 C++ 컴파일 의존성 문제C++은 인터페이스와 구현을 깔끔하게 분리하지 못한다.구현 세부사항이 헤더에 포함되기 때문이다.구현 세부사항이란, 멤버 변수, 암시적 인라인 함수 등.#include 문을 통한 헤더 파일들 사이의 컴파일 의존성(compilation dependency)이 발생할 수 있다.구현부의 외부로 노출되지 않은 코드를 수정했음에도 건들지 않은 다른 곳까지 몽땅 컴파일 / 링크되는 상황이 발생할 수 있다.#include #include "date.h"#include "address.h"// #include 문을 통한 컴파일 의존성 발생class Person{public: Person(const string& name, cons..
항목 30. 인라인 함수는 미주알 고주알 따져서 이해해 두자. 인라인 함수함수처럼 보이고, 함수처럼 동작하고, 매크로보다 훨씬 안전하고 쓰기 좋다.(항목 2 참조)함수 호출 비용이 면제된다.(함수 호출 시 발생하는 오버헤드 걱정이 없다.)컴파일러가 함수 본문에 대해 문맥별(context-specific) 최적화를 해줄 여지가 높아진다.대체적으로 컴파일러 최적화는 함수 호출이 없는 코드가 연속적으로 이어지는 구간에 적용되도록 설계된다.인라인 함수는 함수 호출이 없는 것과 마찬가지로 인식되므로 최적화될 확률이 높다.실제로 대부분의 컴파일러는 아웃라인(outline) 함수 호출(일반적인 함수 호출)에 대해서는 이런 최적화를 적용하지 않는다. 인라인 함수와 프로그램 크기인라인 함수 아이디어는 함수 호출문..
항목 29 : 예외 안전성이 확보되는 그날을 위해 싸우고 또 싸우자! 예외 안정성을 고려하지 않은 코드class PrettyMenu{public: ... void changeBackground(istream& imgSrc); // 배경 그림을 바꾸는 함수 ...private: Mutex mutex; Image* bgImage; int imageChanges;};void PrettyMenu::changeBackground(istream& imgSrc){ lock(&mutex); delete bgImage; ++imageChanges; bgImage = new Image(imgSrc); unlock(&mutex);} 예외..
항목 28. 내부에서 사용하는 객체에 대한 ‘핸들’을 반환하는 코드는 되도록 피하자. 참조자 반환 함수에 대한 고찰메모리 부담을 최대한 줄이기 위해 실 데이터를 가리키는 포인터를 가지고 있는 사각형 클래스를 만든다.class Point{public: Point(int x, int y); ... void setX(int newVal); void setY(int newVal); ...};class RectData{ Point ulhc; // 좌측 상단 Point lrhc; // 우측 하단};class Rectangle { public: .... // 참조자 형태로 꼭지점 정보를 반환한다. Point& upperLeft() const { ..