분류 전체보기
-
35. 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자.프로그래밍/Effective c++ 2016. 3. 10. 16:41
가상함수를 이용한 다양한 패턴들. 1.템플릿 메서드 패턴가상함수를 private에서 재정의 하고, 실제로 외부에 공개되는 함수는 public에 따로 선언하여 가상함수를 호출한다. 이를 통해 현재 클래스에서 가상함수를 사용하기 전 후에 적절한 처리를 해줄 수 있다.class GameCharacter {public: int healthValue() const { ...// 사전 동작 int retVal = doHealthValue(); ...//사전 동작 return retVal; } private: virtual int doHealthValue() const { ... } 2.함수포인터를 이용한 패턴파생클래스의 타입과 무관하게 클래스 생성자에 함수포인터를 넘겨서 객체를 생성할 때 어떤 함수를 사용할지를 결..
-
34. 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자.프로그래밍/Effective c++ 2016. 3. 10. 16:40
순수 가상함수를 선언한 클래스의 상속을 인터페이스 상속이라 하며, 파생 클래스에게 함수의 인터페이스만을 물려주려는 것이다. 이때 파생클래스는 이 함수를 반드시 정의 해야한다. 단순 가상함수의 목적은 파생클래스가 함수의 인터페이스 뿐만 아니라 구현까지 물려받을 수도 있게 하기 위함이다. 이때 물려받은 구현은 재정의도 가능하다. 이를 구현 상속이라 한다.비가상 함수의 선언 목적은 클래스가 함수의 인터페이스및 필수적인 구현을 반드시 물려받게 하기 위함이다.
-
33. 상속된 이름을 숨기는 것은 피하자.프로그래밍/Effective c++ 2016. 3. 10. 16:40
class Base {private: int x;public: virtual void mf1() = 0; virtual void mf1(int i = 0) ;};class Derived: public Base {public: virtual void mf1();};이와같이 선언하면, Derived클래스에서 mf1(2)를 호출해도 Derived의 mf1이라는 이름이 Base의 그것을 덮어버렸기 때문에 더이상 Derived의 범위에서 mf1(int)함수는 존재하지 않는다.이런 경우다음과 같이 해결한다. class Derived: public Base {public: using Base::mf1; virtual void mf1();}; Base클래스를 private로 상속한 경우에는 using을 쓸 수 없는데,..
-
32. public 상속 모형은 반드시 "is-a"를 따르도록 하자.프로그래밍/Effective c++ 2016. 3. 10. 16:40
public 상속은 is-a 관계이다. 하지만 클래스들 사이에 맺을 수 있는 관계는 has-a, is-implemented-in-terms-of도 있다.그러니 is-a 외의 관계를 is-a로 구현해서 말아먹지 마라. --> 웃기지 마라 니가 든 예제가 잘못된거 아니냐...Rectangle의 makeBigger함수를 만들었으면 virtual로 만들어서 재정의를 해야지 냅다 갖다쓰다니...영어로 is-a이면 이런 걸 해야하는 지 모르겠으나 영어에 끼워맞출려고 이런짓은 왜 하는겨... 어우 안헷갈리던게 헷갈리네 퉤퉤 ----> 다음 단원을 위한 미리 뻘짓인듯
-
-
-
-
28. 내부에서 사용하는 객체에 대한 ‘핸들’을 반환하는 코드는 되도록 피하자프로그래밍/Effective c++ 2016. 3. 10. 16:38
클래스 내부의 객체에 대한 핸들(참조자, 포인터, 반복자)를 반환하는 함수는 최대한 피하자.이 함수를 직접적으로 사용하는 경우는 상관 없으나, 다음과 같이 새로 생성한 지역 객체에 대해서 이 함수를 쓰는 순간 무효참조 핸들(댕글링 포인터)이 된다. Point& upperLeft() const { return pData ->ulhc ; } //내부 객체에 대한 핸들을 반환. const Rectangle boundingBox(const GUIObject& obj) ; //복사생성자로 객체 생성하는 함수const Point *pUpperLeft = & (boundingBox(*pgo).upperLeft()) ; //지역 객체를 생성해 포인터에 그 핸들을 대입.--> 우변의 객체는 이 문장이 끝나는 순간 사라지..