std::basic_ios
ma publicznego konstruktora :
explicit basic_ios (std::basic_streambuf<CharT,Traits>* sb);
IMO, jedynym powodem, dla którego klasa ma konstruktora publicznego, jest użycie autonomicznej instancji tej klasy w programie. Jeśli klasa istnieje tylko po to, aby inne klasy z niej wywodziły się (jak się wydaje basic_ios
), wszystkie konstruktory klasy powinny być protected
. Wszystkie konstruktory std::ios_base
są chronione. Ale z jakiegoś powodu projektanci standardu basic_ios
upublicznili tego konstruktora .
basic_ios
jest używany jako klasa podstawowa dla kilku typów strumieni i nie mogę przewidzieć przypadku użycia, w którym miałbyś taki, który nie byłby przynajmniej a basic_istream
lub basic_ostream
. Czy jest jeden
źródło
basic_ios
afaik, biorąc pod uwagę , że ctor biorącybasic_streambuf*
był publicznie, zanim było to możliweusing B::B;
. Oczekuję, że stare implementacje miały po prostu proxy ctor:A(int x) : B(x) {}
- który działa dobrze, nawet jeśliB
ctor jestprotected
.Nie zauważyłem tego
std::basic_istream
,std::basic_ostream
astd::basic_iostream
także miałem publicznych konstruktorów (każdy bierze astd::basic_streambuf*
).Pozwala to na generyczny programujący analog polimorfizmu, w tym samym stylu co idiom pimpl.
Oznacza to, że w ten sposób możesz utworzyć specjalistyczny typ streambufa i używać go w
basic_
[io]stream
bez konieczności tworzenia specjalistycznych klas strumienia. (Funkcjonalność jest ograniczona: nie możesz przypisać nowego bufora do tego samego strumienia i musisz zewnętrznie śledzić żywotność bufora i jego własność).Wyspecjalizowane
basic_
[io]fstream
ibasic_
[io]stringstream
zawierają pełne wystąpienie powiązanego typu bufora. Oznacza to, że instancja wyspecjalizowanego typu strumienia będzie działać tylko ze swoim wewnętrznym buforem, a nie innym, nawet jednym tego samego typu. Korzystanie z surowegobasic_
[io]stream
jest (niezgrabne) obejściem tego problemu.źródło