#include <iostream>
#include <string>

using namespace std;

class Ausgabedingens;

class Sinnlos
{
  Ausgabedingens *out;
public:
  Sinnlos();
  void tu_was_sinnloses();
  Ausgabedingens* imbue(Ausgabedingens *neuer_wert)
  {
    Ausgabedingens *alter_wert  = out;
    out = neuer_wert;
    return alter_wert;
  }
};

class Ausgabedingens
{
  string wert;
  Ausgabedingens *altes_dingens;
  Sinnlos &sinn;
public:
  Ausgabedingens(string wert, Sinnlos &sinn): wert(wert), altes_dingens(sinn.imbue(this)), sinn(sinn) { }
  void write(string was) { cout << wert << was; }
  ~Ausgabedingens() {sinn.imbue(altes_dingens); }

  Ausgabedingens(Ausgabedingens&) = delete;
  void operator=(Ausgabedingens&) = delete;
};

void Sinnlos::tu_was_sinnloses() {if (out) out->write("Huhu.\n"); }
Sinnlos::Sinnlos(): out(nullptr) {} 


Sinnlos GlobalGraphicsContext;

int main()
{
  Ausgabedingens BackBuffer1("Ding 1: ", GlobalGraphicsContext);
  GlobalGraphicsContext.tu_was_sinnloses();
  {
    Ausgabedingens BackBuffer2("Ding 2: ", GlobalGraphicsContext);
    GlobalGraphicsContext.tu_was_sinnloses();
  }
  GlobalGraphicsContext.tu_was_sinnloses();
}
