More C++ Idioms/Base-from-Member

진영민·2022년 7월 23일
0

More C++ Idioms

목록 보기
6/10

c++에서는 다른 derived class가 실행되기 전에 base class가 initialized된다.
이는 derived class의 요소들이 base class를 사용하기 때문이다.

그러므로 모든 base part는 다른 derived class전에 생성되어야 한다.

하지만 가끔은 derived class에 있는 요소의 데이터를 통해 base class를 생성할 때가 있다.

이는 circular initialization problem을 만들어낸다.

#include <streambuf>
#include <ostream>

namespace std {
  	class streambuf;
  	class ostream {
	explicit ostream(std::streambuf * buf);
	//...

};
}

// A customization of streambuf.
class fdoutbuf : public std::streambuf
{
public:
    explicit fdoutbuf( int fd );
    //...
};

class fdostream : public std::ostream
{
protected:
    fdoutbuf buf;
public:
    explicit fdostream( int fd )
        : buf( fd ), std::ostream( &buf )
        // ostream은 streambuf가 필요하지만 streambuf는 fdoutbuf안에 있다.
    {}
};

이러한 문제를 해결하기 위해 idiom은
base class들은 선언된 순서에 따라 initialized된다는 사실을 이용한다.

#include <streambuf>
#include <ostream>

class fdoutbuf : public std::streambuf
{
public:
    explicit fdoutbuf(int fd);
};

struct fdostream_pbase //새로 생성된 클래스
{
fdoutbuf sbuffer;
explicit fdostream_pbase(int fd)
    : sbuffer(fd)
{}
};

class fdostream
	: protected fdostream_pbase //ostream 보다 먼저 initialized 된다.
	, public std::ostream
{
	public:
	explicit fdostream(int fd)
    	: fdostream_pbase(fd), std::ostream.
      std::ostream(&sbuffer)
	{}
};

int main()
{
	fdostream standard_out(1);
    standard_out << "Hello, World\n";
    return 0;
}
profile
코린이

0개의 댓글