본문 바로가기

프로그래밍언어12

[Effective C++] 항목 35~37 항목 35. 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자 ex)class GameCharacter{ public:virtual int healthValue() const; //캐릭터 체력치 반환 함수} 가상함수를 대체할 4가지 패턴 방식 1.비가상 인터페이스 관용구(Non-Virtual Interface 관용구)를 통한 탬플릿 메서드 패턴 메서드 패턴이란? class GameCharacter{ public:int healthValue() const; //캐릭터 체력치 반환 함수{ ... //사전 동작 int reVal = doHealthValue(); ... //사후 동작 ex) mutex}... private:virtual int doHealthValue() const //파생클.. 2018. 4. 10.
[Effective C++] 항목 29~31 항목 29: 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! void PrettyMenu::changeBackground(std::istream& imgSrc){lock(&mutex); // mutex 를 획득 delete bgImage; // 이전의 배경 그림 없앰++imageChanges; // 그림 변경 횟수를 갱신bgImage = new Image(imgSrc); // 새 배경그림을 생성 unlock(&mutex); // mutex 해제} 예외 안전성을 가진 함수라면 예외가 발생할 때 아래처럼 동작해야 한다.1. 자원이 새도록 만들지 않는다 - 위의 코드는 자원이 샌다. new Image(imgSrc) 에서 예외를 던지면 unlock 함수가 실행되지 않아 뮤텍스가 계속 잡힘2. 자료구조가 더.. 2018. 4. 10.
[Effective C++] 항목 26~28 항목 26. 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자. - 생성자 혹은 소멸자를 끌고다니는 타입으로 변수를 정의하면 반드시 물게 되는 비용이 두 가지 있다. 하나는 프로그램 제어 흐름이 변수의 정의에 닿을 때 생성자가 호출되는 비용이고, 또 하나는 그 변수가 유효범위를 벗어날 때 소멸자가 호출되는 비용이다. 아래의 예제에서 encryped 부분을 자세히 보면 std::string EncryptPassword( const std::string password ){ using namespace std; string encryped; if( password.length() < MIN_PASSWORD_LENGTH ) { throw logic_error( "Password is too short".. 2018. 4. 10.
[Effective C++] 항목 22 ~ 25 항목 22. 데이터 멤버가 선언될 곳은 private 영역임을 명심하자. 캡슐화(encapsulation) class SpeedDataCollection{public:void addvalue(int speed); // 속도값 수집double averageSoFar() const; // 평균값 반환...} 첫 번째 방법 : 지금까지 수집한 속도 데이터 전체의 평균값을 담는 데이터 멤버를 클래스 안에 넣어 둠. averageSoFar() 호출될 때마다 멤버의 값을 반환하기만 하면 끝.두 번째 방법 : averageSoFar() 호출할 때마다 평균값 계산. 정답은 없다 : 메모리 불충분, 평균값 그다지 필요하지 않은 환경 -> 두 번째 메모리가 충분하며 평균값을 빈번히 사용하고 속도가 중요 -> 첫 번째 접근.. 2018. 1. 23.