std::basic_ios
hat einen öffentlichen Konstruktor :
explicit basic_ios (std::basic_streambuf<CharT,Traits>* sb);
IMO, der einzige Grund für eine Klasse, einen öffentlichen Konstruktor zu haben, ist die Verwendung einer eigenständigen Instanz dieser Klasse in einem Programm. Wenn eine Klasse nur existiert, um andere Klassen davon abzuleiten (wie es der Fall zu sein scheint basic_ios
), sollten alle Konstruktoren der Klasse vorhanden sein protected
. Die Konstruktoren von std::ios_base
sind alle geschützt. Aber aus irgendeinem Grund haben die Designer des Standards diesen einen Konstruktor der basic_ios
Öffentlichkeit gemacht.
basic_ios
wird als Basisklasse für mehrere Stream-Typen verwendet, und ich kann mir keinen Anwendungsfall vorstellen, in dem Sie einen haben würden, der nicht mindestens ein basic_istream
oder war basic_ostream
. Ist dort eines?
quelle
basic_ios
ctor, der a nimmt,basic_streambuf*
ist seit jeher öffentlichusing B::B;
. Ich gehe davon aus, dass alte Implementierungen nur einen Proxy-Ctor hatten:A(int x) : B(x) {}
- was auch dann gut funktioniert, wenn es sich um einenB
Ctor handeltprotected
.Was ich nicht bemerkt hatte , dass
std::basic_istream
,std::basic_ostream
undstd::basic_iostream
hatte auch öffentlichen Bauer (jeweils nimmt einestd::basic_streambuf*
).Dies ermöglicht ein generisches Programmieranalogon des Polymorphismus in der gleichen Weise wie das Pimpl-Idiom.
Auf diese Weise können Sie einen speziellen Streambuf-Typ erstellen und in einem
basic_
[io] verwenden,stream
ohne spezielle Stream-Klassen erstellen zu müssen. (Die Funktionalität ist eingeschränkt: Sie können nicht demselben Stream einen neuen Puffer zuweisen, und Sie müssen die Lebensdauer und den Besitz des Puffers extern verfolgen.)Die spezialisierten
basic_
[io]fstream
undbasic_
[io]stringstream
enthalten jeweils eine vollständige Instanz des zugeordneten Puffertyps. Dies bedeutet, dass eine Instanz eines spezialisierten Stream-Typs nur mit seinem internen Puffer funktioniert und nicht mit einem anderen, nicht einmal mit einem vom gleichen Typ. Die Verwendung eines rohenbasic_
[io]stream
ist eine (klobige) Problemumgehung.quelle