구)홈페이지 오탈자 보기
GoF 디자인 패턴! 이렇게 활용한다: C++로 배우는 패턴의 이해와 활용

 

페이지오탈자 내용등록일
62

(62페이지 8째줄)

고통
==>
공통

2006-10-251
62

(62 페이지 8 째줄)

여러 하위 클래스들의 고통된 데이터를   ===>   공통된 데이터를
==>
확인완료

2006-10-251
249

(249p [소스14-1])

소스 버그
==>
원래 최상위의 EnemyImage 클래스는 static 데이터 멤버를 가지면 안 되고, 각각의 서브 클래스들이 static 데이터 멤버를 가지는 형태여야 맞습니다.(예제 소스를 수정하여 올려 놓았으니 다시 받아서 확인하시기 바랍니다.) 
---------- 수정 소스 ------------------------------- 
/* --- flyweight.C --- */
#include <iostream>
using namespace std;

class EnemyImage {
  public :
    virtual void Display(int x, int y)=0;
  protected :
    EnemyImage() {}
    EnemyImage(const EnemyImage& rhs);
    // static EnemyImage * pInstance_;
};

//-- EnemyImage* EnemyImage::pInstance_ = 0;

class EnemyNoActionImage : public EnemyImage {
  public :
    static EnemyImage * CreateInstance() {
      if (pInstance_ == 0) {
        pInstance_ = new EnemyNoActionImage;
        cout << "EnemyNoActionImage" << endl;
      }
      return pInstance_;
    }

    void Display(int x, int y) {
      // -- x,y 위치에 비트맵 이미지 표시
    }
  protected :
    EnemyNoActionImage() { }
    EnemyNoActionImage(const EnemyNoActionImage& rhs);
    static EnemyImage * pInstance_;
};

EnemyImage* EnemyNoActionImage::pInstance_ = 0;

class EnemyMoveImage : public EnemyImage {
  public :
    static EnemyImage * CreateInstance() {
      if (pInstance_ == 0) {
        pInstance_ = new EnemyMoveImage;
        cout << "EnemyMoveActionImage" << endl;
      }
      return pInstance_;
    }

    void Display(int x, int y) {
      // -- x,y 위치에 비트맵 이미지 표시
    }
  protected :
    EnemyMoveImage() { }
    EnemyMoveImage(const EnemyMoveImage& rhs);
    static EnemyImage * pInstance_;
};

EnemyImage* EnemyMoveImage::pInstance_ = 0;

class EnemyAttackImage : public EnemyImage {
  public :
    static EnemyImage * CreateInstance() {
      if (pInstance_ == 0) {
        pInstance_ = new EnemyAttackImage;
        cout << "EnemyAttackActionImage" << endl;
      }
      return pInstance_;
    }

    void Display(int x, int y) {
      // -- x,y 위치에 비트맵 이미지 표시
    }
  protected :
    EnemyAttackImage() { }
    EnemyAttackImage(const EnemyAttackImage& rhs);
    static EnemyImage * pInstance_;
};

EnemyImage* EnemyAttackImage::pInstance_ = 0;

class EnemyDieImage : public EnemyImage {
  public :
    static EnemyImage * CreateInstance() {
      if (pInstance_ == 0) {
        pInstance_ = new EnemyDieImage;
        cout << "EnemyDieActionImage" << endl;
      }
      return pInstance_;
    }

    void Display(int x, int y) {
      // -- x,y 위치에 비트맵 이미지 표시
    }
  protected :
    EnemyDieImage() { }
    EnemyDieImage(const EnemyDieImage& rhs);
    static EnemyImage * pInstance_;
};

EnemyImage* EnemyDieImage::pInstance_ = 0;

class Enemy {
  public :
    Enemy(int x, int y) {
      curX_ = x; curY_ = y;
      pCurImage_ = EnemyNoActionImage::CreateInstance();
    }

    void Move(int x, int y) {
      curX_ = x; curY_ = y;
      pCurImage_ = EnemyMoveImage::CreateInstance();
    }

    void Attack() {
      pCurImage_ = EnemyAttackImage::CreateInstance();
    }

    void Display() {
      pCurImage_->Display(curX_, curY_);
    }

  private :
    int curX_, curY_;
    EnemyImage * pCurImage_;
};

int
main()
{
  Enemy e1(10,10), e2(20,20);

  e1.Move(30, 30);
  e2.Attack();
  e2.Move(40, 40);
}

2006-10-251
279

(279 페이지)

[표 16-31]  ===>  [표 16-3]
==>
확인완료

2006-10-251
23425

(p425 Subject::Detach method)

if (*iter == pObj) observers_.erase(iter)

=>

if (*iter == pObj) iter = observers_.erase(iter)

2006-12-283
451

([p451] 구현 관련 사항 소제목의 문단중 위에서 7번째 줄)

그러므로 State 패턴을 구현할 때 상태 전환을 수행할 수 있는 방법은 Cleint가 직접 수행하는 것과 ..."
==>
"그러므로 State 패턴을 구현할 때 상태 전환을 수행할 수 있는 방법은 Client가 직접 수행하는 것과 ..."

2006-10-251
497

(497 페이지 [그림 27-4] 에서)

두번째 aConcreteElementA ===> aConcreteElementB
==>
확인완료

2006-10-251