std::basic_ios
memiliki konstruktor publik :
explicit basic_ios (std::basic_streambuf<CharT,Traits>* sb);
IMO, satu-satunya alasan bagi kelas untuk memiliki konstruktor publik adalah untuk menggunakan contoh mandiri dari kelas itu dalam suatu program. Jika suatu kelas ada hanya untuk memiliki kelas lain turun dari itu (seperti yang tampaknya terjadi basic_ios
), semua konstruktor kelas harus protected
. Konstruktor std::ios_base
semua dilindungi. Tetapi, untuk beberapa alasan, para perancang standar menjadikannya sebagai konstruktor basic_ios
publik.
basic_ios
digunakan sebagai kelas dasar untuk beberapa jenis aliran, dan saya tidak bisa membayangkan kasus penggunaan di mana Anda akan memiliki satu yang setidaknya basic_istream
atau tidak basic_ostream
. Apakah ada satu?
sumber
basic_ios
aktor yang mengambilbasic_streambuf*
telah publik sejak sebelum Anda bisa melakukannyausing B::B;
. Saya berharap bahwa implementasi lama hanya memiliki ctor proxy:A(int x) : B(x) {}
- yang berfungsi dengan baik bahkan jikaB
ctor adalahprotected
.Apa yang saya gagal perhatikan adalah bahwa
std::basic_istream
,std::basic_ostream
danstd::basic_iostream
juga memiliki konstruktor publik (masing-masing membutuhkan astd::basic_streambuf*
).Hal ini memungkinkan analog pemrograman-generik polimorfisme, dengan nada yang sama dengan ungkapan pimpl.
Artinya, dengan cara ini Anda dapat membuat tipe streambuf khusus dan menggunakannya dalam
basic_
[io]stream
tanpa harus membuat kelas aliran khusus. (Fungsinya terbatas: Anda tidak dapat menetapkan buffer baru ke stream yang sama, dan Anda harus melacak secara eksternal masa pakai dan kepemilikan buffer).The khusus
basic_
[io]fstream
danbasic_
[io]stringstream
masing-masing berisi contoh lengkap dari jenis buffer terkait. Ini berarti sebuah instance dari tipe stream khusus hanya akan bekerja dengan buffer internal dan bukan yang lain, bahkan tidak satu dari tipe yang sama. Menggunakanbasic_
[io] mentahstream
adalah solusi (kikuk) untuk ini.sumber