sonst/kompptr2.cpp

Das folgende Code-Beispiel stammt aus dem Buch
Objektorientiertes Programmieren in C++ - Ein Tutorial für Ein- und Umsteiger
von Nicolai Josuttis, Addison-Wesley München, 2001
© Copyright Nicolai Josuttis 2001


#include <iostream>

class BspKlasse {
  public:
    void func1() {
        std::cout << "Aufruf von func1()" << std::endl;
    }
    void func2() {
        std::cout << "Aufruf von func2()" << std::endl;
    }
};

// Datentyp: Zeiger auf Elementfunktion der Klasse BspKlasse
//     ohne Parameter und Rückgabewert
typedef void (BspKlasse::*BspKlassenFunktion) ();

// exportiertes Objekt und exportierte Elementfunktion
void* objPtr;
void* objfpPtr;

void exportObjectAndFunction (void* op, void* fp)
{
    objPtr = op;
    objfpPtr = fp;
}

void callBspKlassenFunc (void* op, void* fp)
{
    // Typen zurückwandeln
    BspKlasse* bspObjPtr = static_cast<BspKlasse*>(op);
    BspKlassenFunktion* bspObjfpPtr
                         = static_cast<BspKlassenFunktion*>(fp);

    // übergebene Elementfunktion für das übergebene Objekt aufrufen
    (bspObjPtr->*(*bspObjfpPtr)) ();
}

int main ()
{
    // Objekt der Klasse BspKlasse
    BspKlasse x;

    // Funktionszeiger auf Elementfunktion der Klasse BspKlasse
    BspKlassenFunktion funcPtr;

    // Komponentenzeiger zeigt auf func1()
    funcPtr = & BspKlasse::func1;

    // Objekt und Elementfunktion exportieren
    exportObjectAndFunction (&x, &funcPtr);

    // exportierte Elementfunktion für exportiertes Objekt aufrufen
    callBspKlassenFunc (objPtr, objfpPtr);
}