이번 항목은 객체지향 기술은 무엇이 있고, 어떻게 사용되어야 하는가? 에 대한 것이다. 두 가지 종류의 통신 세션을 가진 네트워킹 어플리케이션이 있고, 각 세션은 자신의 메세지 프로토콜을 가지며, 각 세션은 스스로가 전송을 담당한다고 보자. 그래서 코드를 짜면 아래와 같을 것 이다. /* Base 클래스 */ class BasicProtocol { public: BasicProtocol( ); virtual ~BasicProtocol( ); bool BasicMsgA( /* ... */ ); bool BasicMsgB( /* ... */ ); bool BasicMsgC( /* ... */ ); }; /* Derived 클래스 */ class protocol1 : public BasicProtocol { ..
책 정리 검색 결과
이번 항목은 가상함수를 사용시, 주의해야 할 점을 설명하고 있다. 다음 코드를 보자. #include #include using namespace std; /*Base 클래스의 정의 구역*/ class Base { public: virtual void f( int ); virtual void f( double ); virtual void g( int i = 10 ); }; void Base::f( int ) { cout
이번 항목은 보다 전문가적 스타일에 중점을 두었으며, 이 원리를 이해 한다면, 더 유지보수가 편하고 견고한 클래스 디자인에 도움이 될 것이다. 다음 코드를 보자. // 예제코드 class Complex { public: Complex( double real, double imaginary = 0 ) : _real( real ), _imaginary( imaginary ) { } void operator+ ( Complex other ) { _real = _real + other._real; _imaginary = _real + other._imaginary; } void operator
Pimpl 의 주요 단점은 항당 new 를 이용하여, 생성하고 delete를 이용하여 해제하는 과정을 겪어야 한다는 점이다. 보다 안전하고 보다 빠르게 사용 할수 있을까? ... 아래 3가지 시도를 우선 보도록 하자. /* 시도 1 */ // file y.h #include "x.h" class Y { /* ... */ X x_; }; // file y.cpp Y::Y() { } 역시 이 시도1로 하면 Pimpl의 비용을 전혀 내지 않지만, Pimpl 은 쓰지 않으니 .. 한번 사용해 보도록 하자. /* 시도 2 */ // file y.h class X; class Y { /* ... */ X* px_; }; // file y.cpp #include "x.h" Y::Y() : px_( new X ) { ..
항목 27에서 Pimpl 이디엄을 사용하여, 컴파일 타임 상호 의존성을 매우 줄였다. 하지만 Pimpl 을 어떻게 짜야만 더 좋고 안전하게 만들 수 있는지에 대해서는 무시하고 진행 했었다. 그런데.. 생뚱맞게 왜 항목이 "컴파일 방화벽" 이라는 말이 나왔지? 곰곰해 생각해 보면 Pimpl 이디엄은 그 컴파일러 입장에서 보면, 보이지 않는 벽같은 것이라 할 수도 있겠다. 음~ 본론으로 들어와서, 어떻게 만드는 것이 가장 좋을까? 크게 몇가지 규칙을 적어 본다. 모든 private 데이터를 XImpl에 넣는다.(함수는 제외) 모든 private 멤버들을 XImpl에 넣는다. 모든 Private와 Protected 멤버들을 XImpl 에 넣는다. XImpl을 전체적으로 X가 가지고 있는 클래스로 만들고, X를..
파트 1 ~ 2 까지 하면서 믿을 수 없게, 컴파일 의존성을 줄였다. 다음 코드는 파트 2 까지 정리된 코드이다. /* x.h : 원본 헤더, 컴파일 의존성 줄이기 위해 Pimple 적용된 모습 */ #include // 포워드 헤더 포함 #include "a.h" #include "b.h" class X : public A, private B { public: class C; // 포워드 선언 사용 X( const C& ); B f( int, char* ); C f( int, C ); C& g( B ); class E; // 포워드 선언 사용 E h( E ); virtual std::ostream& print( std::ostream& ) const; private: struct XImpl; XImpl..
최근댓글