왜 std :: basic_ios에 public 생성자가 있습니까?


15

std::basic_ios공개 생성자가 있습니다 :

explicit basic_ios (std::basic_streambuf<CharT,Traits>* sb);

클래스가 공용 생성자를 갖는 유일한 이유는 프로그램에서 해당 클래스의 독립형 인스턴스를 사용하는 것입니다. 클래스가 다른 클래스의 클래스에서만 존재하는 경우 (있는 경우 basic_ios) 클래스의 모든 생성자는이어야합니다 protected. 의 생성자 std::ios_base는 모두 보호됩니다. 그러나 어떤 이유로 표준 설계자들은 이것을 하나의 basic_ios공개 생성자로 만들었습니다 .

basic_ios는 여러 스트림 유형의 기본 클래스로 사용되며 적어도 a basic_istream또는 basic_ostream. 하나 있습니까?

답변:


1

클래스가 public 생성자를 갖는 또 다른 이유는이 생성자 서명을 사용하여 파생 객체를 생성 할 수 있기 때문입니다.

struct B{
  B(int);
  protected:
  ~B();
  };

 struct A:B{
    private://no effect.
    using B::B;

    public:
    A(void*);
    };

 A a(10);

기본 생성자의 using 선언은 상속 된 생성자의 액세스 가능성을 변경하지 않으므로 생성자는 기본 클래스에서 public이어야합니다.


2
afaik를 제외하고는 basic_ioscson을 복용 한 ctor가 basic_streambuf*당신이 할 수 있기 전에 공개 된 적이 있습니다 using B::B;. 이전 구현에는 프록시 ctor가 있다고 기대합니다. A(int x) : B(x) {}- Bctor가 c 인 경우에도 제대로 작동합니다 protected.
테드 Lyngmo

0

내가 통지에 실패하면 해당이었다 std::basic_istream, std::basic_ostream그리고 std::basic_iostream(각각 소요 공공 생성자를했다 std::basic_streambuf*).

이것은 pimpl 관용구와 같은 맥락에서 다형성의 일반적인 프로그래밍 유사체를 허용합니다.

즉, 이렇게하면 특수 스트림 클래스 형식을 만들어 특수 스트림 클래스를 만들 필요없이 basic_[io] 에서 사용할 수 stream있습니다. (기능이 제한됩니다. 동일한 스트림에 새 버퍼를 할당 할 수 없으며 외부 적으로 버퍼의 수명과 소유권을 추적해야합니다).

특수화 된 basic_[io] fstreambasic_[io]는 stringstream각각 관련 버퍼 유형의 전체 인스턴스를 포함합니다. 즉, 특수 스트림 유형의 인스턴스는 내부 버퍼에서만 작동하며 동일한 유형 중 하나가 아닌 다른 내부 버퍼에서만 작동합니다. 원시 basic_[io]를 사용하는 stream것이 이것에 대한 (복잡한) 해결 방법입니다.

template<class C, class TR>
class snazzy_filebuf: public std::basic_streambuf<C, TR>
{
 protected:
   typename TR::int_type overflow(TR::int_type) override;
   typename TR::int_type underflow(TR::int_type) override;
   typename TR::int_type pbackfail(TR::int_type) override;
 public:
   snazzy_filebuf();
};

.....
snazzy_filebuf<char> buf;
std::basic_ostream<char> o_s(&buf); 

o_s << "Hello, world\n";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.