Hallo zusammen,

in diesem Post möchte ich euch etwas erzählen, über das Entkoppeln von Objekten durch Callbacks mit C++-Interfaces oder boost::function und boost::bind. Der Post ist diesmal als PDF Datei eingebunden. Hintergrund ist, dass das PDF einem Workshop entstammt, den ich im November 2010 zu eben diesem Thema in unserer Firma gehalten habe. Als Beispiel sind zwei Klassen vorgegeben: eine Klasse A und eine Klasse B. Klasse A inkludiert die Klasse B und benutzt diese. Im ersten Szenario muss die Klasse B von der Klasse A nichts wissen. Im zweiten Szenario muss die Klasse B auch die Klasse A zum Zwecke eines Rückrufs kennen. Dazu benutzt sie einen Zeiger auf A, was diverse Probleme mit sich bringt. In den folgenden Lösungsansätzen wird aufgezeigt, wie mithilfe von C++ – Interfaces oder boost::bind und boost::function die Klasse B von der Klasse A entkoppelt werden kann. In einem weiteren Szenario wird gezeigt, wie man mithilfe von Vorwärtsdeklaration, dem Verwenden eines Zeigers in der Deklaration (anstatt einer kompletten Klasse) dem inkludieren der Klassendeklaration in der CPP-Datei und dem Anlegen des verwendeten Objekts im Konstruktor und dem Zerstören des Objekts im Destruktor, die Include-Abhängigkeiten nach oben terminiert werden können, was sich wiederum positiv auf die Übersetzungszeiten auswirkt. Im Anschluss daran folgen noch ein paar weitere Beispiele zu verzögerten Funktionsaufrufen mithilfe von boost::function und boost::bind. Für Tipps, Korrekturen und konstruktive Kritik (, natürlich aber auch für Zuspruch :-)) bin ich sehr dankbar. Viel Spaß mit dem PDF:

c++_entkoppeln_durch_interfaces_oder_boost_funktions_zeiger

Gruß,

Daniel

Tour auf die Hintere Goinger Halt   December 15th, 2010

Hallo zusammen,

obwohl die Tour schon ein Weilchen her ist, möchte ich doch noch über sie berichten, da es sich um eine sehr schöne Bergtour handelt. Letzten Sommer war ich im August im Kaisergebirge unterwegs. Ich entschied mich für die Bergtour zur Hinteren Goinger Halt (2192 m). Ausgangspunkt war die Wochenbrunner Alm auf 1085 m Höhe. Um kurz vor 7:00 Uhr brach ich von der Wochenbrunner Alm aus auf und marschierte durch das Waldgebiet ca. 1 h lang zur Gruttenhütte auf 1619 m.

Blick von der Wochenbrunner Alm aus.

Blick von der Wochenbrunner Alm aus.

Die Gruttenhütte im Visier.

Die Gruttenhütte im Visier.

Dort genoss ich erstmal die schöne Aussicht auf den gegenüberliegenden Großvenediger und genehmigte mir ein kleines Frühstück.

Frühstück auf der Gruttenhütte.

Frühstück auf der Gruttenhütte: Blick zum Kaiser ...

Blick auf den Großvenediger.

... und Blick auf den Großvenediger.

Nach dieser kurzen Stärkung, ging es dann weiter zum Jubiläumssteig. Der Jubiläumssteig ist ein einfacher gesicherter Klettersteig, der sich gut für Anfänger eignet und so konnte ich auch hier zum ersten Mal mein Klettersteig-Set ausprobieren. Nichtsdestotrotz ist es ein sehr schöner Klettersteig, den ich nur empfehlen kann.

Im Jubiläumssteig.

Im Jubiläumssteig.

Im Jubiläumssteig.

Leiter im Jubiläumssteig

Im Jubiläumssteig.

Immer schön gesichert!

Nach dem Jubiläumssteig, kommt man ins Kübelkar, einem Kar aus Schutt.

Vom Jubiläumssteig ins Küblkar.

Vom Jubiläumssteig ins Küblkar.

Während man durch das Kar wandert, kann man auf der linken Seite eine steile Felswand sehen, an der echte Felskletterer klettern. Allein beim zuschauen wird einem schwindlig.

Felskletterer in luftigen Höhen.

Felskletterer in luftigen Höhen.

Am Ende des Kars angekommen, hat man das Ellmauer Tor erreicht. Dieser Sattel ist eine beliebte Pausestation für die Wanderer. Das haben auch die Vögel bemerkt, die auf den einen oder anderen Brocken Brot oder Wurst warten.

Blick auf Wochenbrunner Alm. Links: Ein (sympatischer) Mittesser.

Pause im Ellmauer Tor

Nach einer kurzen Verpflegungspause, ging es rechter Hand hinauf zur Hinteren Goinger Halt. Diese ist nur an einer kurzen Stelle gesichert, ansonsten handelt es sich um leichtere Felskletterei, die man aber nicht auf die leichte Schulter nehmen sollte. Vorsicht ist hier geboten, daran erinnert auch ein Kreuz eines hier herunter gefallenen. Nach ca. einer Dreiviertelstunde hatte ich den Gipfel erreicht und genoss vorsichtig die fantastische Aussicht. Vorsichtig, weil mittlerweile ein leichter Wind aufkam. Schwindel erregend ist auch die Aussicht vom Gipfel auf das Stripsenjochhaus. Bereits auf dem Aufstieg, traf ich ein Pärchen aus Riedenburg, mit denen ich im losen Verbund den Aufstieg und den Abstieg gemeinsam durchführte. Leider habe ich ihren Namen vergessen. Trotzdem richte ich hier ihnen einen schönen Gruß aus, falls Sie zufällig auf diesen Post stoßen sollten. Vielen Dank auch für das Gipfelfoto!

Gipfelblick auf die Stripsenjochhütte.

Gipfelblick auf die Stripsenjochhütte.

Schwindelerregender Gipfelblick (ins Griesener Kar?)

Schwindelerregender Gipfelblick (ins Griesener Kar?)

Erste Hälfte gut überstanden. Jetzt noch der Abstieg ...

Erste Hälfte gut überstanden. Jetzt noch der Abstieg ...

Auf dem Weg nach unten machte sich dann die abgelaufene Sohle meiner Wanderschuhe negativ bemerkbar. Im Schutt und Geröll, bin ich ein paar Mal hin gefallen, Gott sei Dank jedoch ohne größere Verletzungen. Ich werde mir wohl ein paar neue Wanderschuhe kaufen müssen.

Im Abstieg: Meine Riedenburger Mitwanderer.

Im Abstieg: Meine Riedenburger Mitwanderer.

Rutschpartie abwärts ins Küblkar.

Rutschpartie abwärts ins Küblkar.

Immer schön vorsichtig!

Immer schön vorsichtig!

Ich stieg nicht wieder zur Gruttenhütte hinunter, sondern diesmal direkt zur Gaudeamushütte. Dort genehmigte ich mir zwei Getränke, da mein Wasservorrat mittlerweile aufgebraucht war.

Nach 7 h Tour auf der Gaudeamus-Hütte.

Nach 7 h Tour auf der Gaudeamus-Hütte.

Nach einem kurzen Abstieg war ich wieder am Ausgangspunkt meiner Tour, der Wochenbrunner Alm angekommen.

Insgesamt war ich 8 h unterwegs und muss sagen, dass es eine sehr schöne und abwechslungsreiche Bergtour war, die ich gerne noch einmal wiederholen werde. Meine nächste Tour im Kaisergebirge, soll jedoch auf die Ellmauer Halt auf 2344 m gehen.

Bis zum nächsten Post,

Daniel

In meinem heutigen Post möchte ich euch etwas erzählen über den shared_ptr und seine Fähigkeit allozierte Ressourcen abweichend von delete mit einer benutzerdefinierten Funktion oder einer benutzerdefinierten Methode zu entfernen. Nehmen wir einmal an, wir hätten eine Klasse, welche Speicher verwaltet und auf Anfrage Handles auf Speicher herausgibt und über die vergebenen Handles den Speicher wieder löscht. Um Speicherlöcher zu finden zählt die Klasse den vergebenen und wieder beseitigten Speicher mit. Eine solche Klasse könnte wie folgt aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "stdafx.h"
#include <assert.h>
#include <boost\shared_ptr.hpp>
#include <boost\function.hpp>
#include <boost\bind.hpp>
#include <iostream>
 
typedef unsigned char MemChunk;
typedef unsigned char* MemHandle;
 
class MemResourceFabric
{
private:
  MemResourceFabric():count_(0){}
public:
  static MemResourceFabric* instance(){static MemResourceFabric i;return &i;}
  ~MemResourceFabric()
  {
    assert(count_==0);
  }
  MemHandle openMemory()
  {
    count_++;
    return new unsigned char[100];
  }
  void closeMemory(MemHandle mem_handle)
  {
    count_--;
    delete [] mem_handle;
  }
private:
  int count_;
};

Über die Funktion openMemory() wird der Speicher angefordert, über die Funktion closeMemory(MemHandle mem_handle) wieder freigegeben. Wenn nun innerhalb einer Funktion eine Ausnahme auftritt, könnte es sein, dass der angeforderter Speicher nicht mehr freigegeben wird, da unter C++ die Funktion closeMemory nicht von selber aufgerufen wird. Hier kann uns das unter C++ sehr weit verbreitete Idiom RAII (Resource Alocation Is [Resource] Initialization) mithilfe von boost::shared_ptr und boost::bind helfen. Normalerweise gibt der shared_ptr verwaltete Ressourcen in seinen Destruktor per delete wieder frei. Man kann ihm aber auch einen Funktor übergeben, welcher die verwaltete Resource anstelle von delete wieder freigeben soll. Im vorliegenden Beispiel soll der angeforderter Speicher mithilfe der Funktion closeMemory wieder freigegeben werden. Als Instanz soll unser Singleton, MemResourceFabric verwendet werden:

34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
int _tmain(int argc, _TCHAR* argv[])
{
  boost::shared_ptr<MemChunk> shp_mem_1(
    MemResourceFabric::instance()->openMemory(),
    boost::bind(
      &MemResourceFabric::closeMemory,
      MemResourceFabric::instance(),
      _1)
  );
 
  strcpy(
    (char*)shp_mem_1.get(),
    "Hello memory. Memory wird auch bei Ausnahmen deleted.");
 
  std::cout << (char*)shp_mem_1.get() << std::endl;
 
  return 0;
}

Diese Technik ist in einer Reihe von Szenarios sehr hilfreich, bei denen die Ressourcen abseits von delete verwaltet werden: Datenbank öffnen, Netzwerkverbindung öffnen, Datei öffnen, Synchronisation von Threads, et cetera…

Viel Spaß mit RAII und bis zum nächsten Post,

Daniel.