You are here

Ableiten einer inneren Klasse von std::streambuf

Die innere Klasse OG_constreambuf wird von streambuf abgeleitet.

class OG_constreambuf : public std::streambuf
{
public:
  OG_constreambuf(int iBuffersize=100);
  virtual ~OG_constreambuf();

private:
  void WriteCharToConsole(int);
  void WriteToConsole();
  void DeleteConsole();
  void CreateConsole();

  HANDLE hConsoleOut;
  char* pReserve;
protected:
  int_type overflow(int_type);
  int_type sync();
};

Die Elemente im public- und im protected-Bereich stellen Überschreibungen der Basisklasse dar, die Elemente im private-Bereich sind Erweiterungen. Die Klasse benutzt einen Ausgabe-Puffer, auf den pReserve zeigt und der in dem Konstruktor reserviert wird. Der Konstruktor erlaubt die Angabe der Puffergrösse.

OG_constreambuf::OG_constreambuf(int iBuffersize)
{
  if (iBuffersize)
  {
    pReserve = new char[iBuffersize];
    setp(pReserve, pReserve + iBuffersize);
  }
  else
  {
    pReserve = NULL;
    setp(0, 0);
  }

  setg(0, 0, 0);

  CreateConsole();
}

Der Konstruktor ruft dann noch die Funktionen setp, setg und CreateConsole auf. Die Funktionen setp und setg sind von der Basisklasse geerbt und dienen dazu den Ein- bzw. Ausgabepuffer für die Benutzung durch die Stream-Klasse bekannt zu machen. setp setzt den Beginn und das Ende des Ausgabe-Puffers, setg ist das Pendant für den Eingabe-Puffer (hier 0, da kein Eingabe-Puffer vorhanden ist). Die Funktion CreateConsole öffnet ein Konsolen-Fenster. Falls schon ein Konsolen-Fenster existiert, wird es zuerst zerstört. Der HANDLE hConsoleOut wird für die Ausgabe benötigt.

void OG_constreambuf::CreateConsole()
{
  if (!AllocConsole())
  {
    FreeConsole();
    AllocConsole();
  }
  hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
}