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);
}