`Std :: basic_ios`'un neden bir kamu kurucusu var?


15

std::basic_iosbir kamu kurucusu var :

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

IMO, bir sınıfın ortak bir kurucuya sahip olmasının tek nedeni, bir programda o sınıfın bağımsız bir örneğini kullanmaktır. Bir sınıf yalnızca diğer sınıfların ondan alçalması için mevcutsa (durumun göründüğü gibi basic_ios), sınıfın tüm kurucuları olmalıdır protected. İnşaatçılarının std::ios_basehepsi korunur. Ancak, bir nedenden dolayı, standardın tasarımcıları bunu bir basic_ioskamu kurucusu yaptı .

basic_iosçeşitli akış türleri için temel sınıf olarak kullanılır ve en az a basic_istreamveya olmayan bir tane kullanacağınız bir kullanım durumu öngöremiyorum basic_ostream. Bir tane var mı?

Yanıtlar:


1

Bir sınıfın ortak bir kurucuya sahip olmasının diğer nedeni, türetilmiş bir nesne oluşturmak için bu kurucu imzasının kullanılabilir olmasını sağlamaktır:

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

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

    public:
    A(void*);
    };

 A a(10);

Bir temel kurucunun kullanım bildirimi devralınan kurucunun erişilebilirliğini değiştirmediğinden, kurucu temel sınıfta herkese açık olmalıdır.


2
Afaik hariç, restorable gibi görünüyor, basic_iosa alarak ctor basic_streambuf*yapabileceğinizden beri halka açıktı using B::B;. : Eski uygulamalar sadece bir proxy ctor vardı bekliyoruz A(int x) : B(x) {}ince olsa bile çalışır - B'ın ctor olduğunu protected.
Ted Lyngmo

0

Fark etmediğim şey std::basic_istream, std::basic_ostreamve std::basic_iostreamaynı zamanda kamu kurucuları vardı (her biri bir alır std::basic_streambuf*).

Bu, pimpl deyimiyle aynı damarda polimorfizmin jenerik programlama analoğuna izin verir.

Yani, bu şekilde özel bir streambuf türü oluşturabilir ve özel akış sınıfları oluşturmak zorunda kalmadan bunu basic_[io] ' streamda kullanabilirsiniz. (İşlevler sınırlıdır: Aynı akışa yeni bir arabellek atayamazsınız ve harici olarak arabellek ömrünü ve sahipliğini izlemeniz gerekir).

Uzmanlaşmış basic_[io] fstreamve basic_[io] değerlerinin stringstreamher biri, ilişkili tampon türünün tam bir örneğini içerir. Bu, özel bir akış türünün bir örneğinin, yalnızca kendi iç arabelleğiyle çalışacağı anlamına gelir, aynı türden biriyle değil, başka biriyle değil. İşlenmemiş bir basic_[io] kullanmak streambunun için (tıknaz) bir çözümdür.

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";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.