가상 함수 대신 쓸 것들도 생각해두는 자세를 시시때때로 길러 두자

Bogoomi·2022년 7월 5일
0

EffectiveC++

목록 보기
18/24

항목35 - 가상 함수 대신 쓸 것들도 생각해두는 자세를 시시때때로 길러 두자

요약
어떤 문제를 해결하기 위한 설계를 찾을 때 가상 함수를 대신하는 방법들도 고려해 보자.

예시
게임 캐릭터의 체력을 반환하는 기능을 구현해보자.

예시코드

public:
virtual int healthValue() const;

위 코드에서 약점을 많이 찾을 수 있다.
가상함수는 반드시 private으로 선언해야한다!
하지만 더 좋은 대체 방안으로 public으로 비가상 함수를 만들고 그 내부에 private으로 선언된 가상 함수를 호출하는 식으로 만들면 좋다.(비가상 함수 인터페이스:NVI)

하지만, 결국 눈속임이다. 게임 캐릭터의 체력을 구현하는 것에 가상함수를 쓴 것은 변함이 없다. 이럴 땐 함수 포인터 데이터 멤버로 대체하자.
또는 std::tr1::function 데이터 멤버로 대체하여 호환되는 시그너처를 가진 함수호출성 개체를 사용
또는 한쪽 클래스 계통에 속해있는 가상함수를 다른 쪽 계통에 속해있는 가상함수로 대체.



잊지말자!

  • 가상 함수 대신 쓸 수 있는 다른 방법으로 NVI 관용구 및 전략패턴을 사용 가능
  • 객체에 필요한 기능을 멤버 함수로부터 클래스 외부의 비멤버 함수로 옮기면, 그 비멤버 함수는 그 클래스의 public 멤버가 아닌
    것들을 접근할 수 없다는 단점 생김
  • tr1::function 객체는 일반화된 함수 포인터처럼 동작. 이 객체는 주어진 대상 시그너처와 호환되는 모든 함수호출성 개체를 지원함.
profile
개에에에바알

0개의 댓글