일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 참조자
- 반복자
- 암시적 변환
- Vector
- Effective c++
- 오블완
- 언리얼
- exception
- 티스토리챌린지
- UE4
- 비교 함수 객체
- 게임
- implicit conversion
- 상속
- 메타테이블
- Smart Pointer
- reference
- 다형성
- 영화 리뷰
- c++
- 스마트 포인터
- more effective c++
- effective stl
- 영화
- 루아
- 예외
- operator new
- resource management class
- virtual function
- lua
- Today
- Total
목록개발 (178)
스토리텔링 개발자
항목 32. 미래 지향적인 프로그래머가 되자 미래 지향적인 프로그래밍사용하고 있는 라이브러리에 함수가 새로 추가될 수 있으며오버로딩도 추가로 이루어질 수 있다는 사실을 인식하고,이 사실로 인해 모호한 함수 호출이 있을 수 있다는 점을 조심하자.기존의 클래스 계통 구조에 새 클래스가 추가될 수 있고,오늘의 파생 클래스가 내일의 기본 클래스가 될 수 있다는 사실을 인식하고 대비하자.새로운 애플리케이션이 만들어질 수 있고,특정 함수의 호출환경이 달라질 수 있다는 사실을 기억하고,이런 함수가 어느 경우에서든 제대로 동작하도록 만들자.소프트웨어 유지 보수를 만든 사람이 맡지 않는 경우가 다반사이므로,다른 사람이 이해하고, 수정하고, 개선하는 데 큰 문제를 일으키지 않는 방법으로 설계하자. 주석이나 문서화 ..
항목 31. 함수를 두 개 이상의 객체(타입)에 대해 가상 함수처럼 동작하도록 만들기 우주선, 정거장, 소행성 의 충돌 구현class GameObject { ... };// 아래의 각 타입은 충돌 타입에 따라 충돌 시 다른 동작을 한다.class SpaceShip : public GameObject { ... };class SpaceStation : public GameObject { ... };class Asteroid : public GameObject { ... };void checkForCollision(GameObject& object1, GameObject& object2){ if(theyJustCollided(object1, object2)) { // 아래 함수의 ..
항목 30. 프록시(Proxy) 클래스 C++의 n차원 배열 문제변수를 배열의 차원으로 사용할 수가 없다.int data[10][20]; // 컴파일 성공void processInput(int dim1, int dim2){ int data[dim1][dim2]; // 컴파일 에러! ...}void processInput2(int dim1, int dim2){ int* data = new int[dim1][dim2]; // 컴파일 에러! ...} 2차원 배열 클래스 만들기templateclass Array2D{public: Array2D(int dim1, int dim2); ...};// 이런 식으로 사용할 수 있다.Array2D data(10, 20);Array2D..
항목 29. 참조 카운팅(Reference Counting) 참조 카운팅이란여러 개의 객체들이 똑같은 값을 가졌으면, 각각이 하나의 데이터를 공유하게 하여, 데이터의 양을 절약하는 기법이다. 참조 카운팅의 동기힙 객체의 관리를 편하게 하기 위함이다.힙에 할당된 객체는 소유권을 추적하는 일이 상당히 까다롭다.하지만 참조 카운팅을 사용하면 소유권을 일일이 추적하지 않아도 된다.똑같은 값을 가지고 있는 객체들이 값을 각각 가지게 되면 낭비이다. 참조 카운팅 기본 구현법class String{public: // 생성자 String(const char* initValue = ""); String(const String& rhs); // 소멸자 ~String(); ..
항목 28. 스마트 포인터(Smart Pointer) 스마트 포인터를 사용하는 이유생성과 소멸 작업을 조절할 수 있다.스마트 포인터가 생성되고 소멸되는 시기를 사용자가 결정할 수 있다.초기값을 스마트 포인터가 컨트롤하므로, 쓰레기값 문제가 없다.객체를 알아서 소멸시켜주므로 리소스 누수가 없다.복사와 대입 동작을 조절할 수 있다.스마트 포인터가 복사되고 대입될 때의 일을 사용자가 결정할 수 있다.깊은 복사와 얕은 복사를 원하는 대로 정의할 수 있다.혹은 복사 대입을 전혀 사용하지 못하도록 막을 수도 있다.역참조 동작을 조절할 수 있다.스마트 포인터가 가리키는 객체를 가져오려고 할 때 일어나는 일을 결정할 수 있다.지연 방식 데이터 / 명령어 가져오기(fetching)(항목 17 참조) 스마트 포인터..
항목 27. 힙(heap)에만 생성되거나 힙에는 만들어지지 않는 특수한 클래스를 만드는 방법 객체가 힙에만 생성되게 하기암시적 객체 생성 / 소멸(변수 선언에 의해 생성자가 자동으로 호출되고 유효범위의 종료에 의해 소멸자가 호출되는 것)을 불법화 시킨다.생성자와 소멸자를 private로 선언한다.생성자를 private화 하는 건 너무 과한 감이 있다. 만약 기존의 것에 적용한다면 인터페이스를 과하게 해친다.그래도 생성자를 private로 하고자 한다면 큰 단점이 있는데..너무 많은 생성자를 고려해야 한다는 점이다.컴파일러가 자동 생성하는 생성자는 public이기 때문이다.소멸자만 private로 선언한다.유사 소멸자(소멸자 기능을 담는 함수)를 만들어서 객체를 소멸시킬 때는 이 유사 소멸자를 호출하도..
항목 26. 클래스 인스턴스의 개수를 의도대로 제한하는 방법 개수 제한의 예시프린터. 프린터 객체는 갯수 제한을 할 수밖에 없을 것이다. 객체 개수를 0개로 제한클래스의 생성자를 private 선언한다.class CanBeInstantiated{private: CanBeInstantiated(); CanBeInstantiated(const CantBeInstantiated&); ...}; 객체 개수를 1개로 제한객체를 생성자 함수 안에 그냥 넣는다.class PrintJob;class Printer{public: void submitJob(const PrintJob& job); void reset(); void performSelfTest(); ... ..
항목 25. 생성자 함수와 비멤버 함수를 가상 함수처럼 만드는 방법 가상 생성자(virtual constructor) : 생성자 함수를 가상 함수처럼런타임에 타입을 체크하겠다(가상) + 명확한 타입의 객체에 대한 메모리 할당(생성자) 가 어떻게 양립 가능할까?하지만 가능한 일이다. 게다가 비일비재하게 사용한다.class NLComponent // 추상 기본 클래스{public: ... // 순수 가상 함수가 최소한 하나는 있다.};// 순수 가상 함수가 없는 하위 클래스들class TextBlock : public NLComponent { ... };class Graphic : public NLComponent { ... };class NewsLetter // 뉴스레터{public: New..