PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktion übergeben in C++


Einfachkrank
2004-02-02, 11:27:52
Hi,

eine Funktion einer Klasse soll eine Funktion übergeben bekommen, die dann in der Klasse immer wieder aufgerufen werden kann, ungefähr so:

void FunktionZumUebergeben(void)
{
// macht was
}

// ...
class Klasse
{
private:
// Funktion zum übergeben

public:
void SetFunction(void nFunc(void));
void Funktion(void);
};

void Klasse::Funktion(void)
{
// übergebene Funktion aufrufen ...
}


Wie Windows das mit seiner Callback Funktion macht, habe ich auch geschafft, also mit __stdcall, aber wie schaffe ich es eine beliebige Funktion zu übergeben ohne das diese Funktion speziell deklariert werden muss?

MFG Einfachkrank

Xmas
2004-02-02, 12:19:01
Wie meinst du das, beliebige Funktion? Wenn du die Funktion aufrufst, musst du doch wissen, wieviele Parameter du übergeben musst. Du kannst natürlich jeden beliebigen (Funktions-)Pointer als void* übergeben, aber davon hast du nichts, weil du den Pointer so nicht als Funktion aufrufen kannst.

Einfachkrank
2004-02-02, 16:56:14
Beispielsweise, die Windows Callback Funktion muss ja mit CALLBACK deklariert werden... auf diese Weise schaffe ich es auch eine Funktion zu übergeben. Im Prinzip will ich einfach bei der Deklaration der "Callback Funktion" das CALLBACK weglassen können, das ist alles.

zeckensack
2004-02-02, 17:05:43
void FunktionZumUebergeben(void)
{
// macht was
}

// ...
class Klasse
{
private:
// Funktion zum übergeben
void (*function_pointer)(void);

public:
void SetFunction(void (*nFunc)(void))
{
function_pointer=nFunc;
}
void Funktion(void);
};

void Klasse::Funktion(void)
{
function_pointer();
// übergebene Funktion aufrufen ...
}
Funktioniert allerdings nur mit Funktionen eines festen Typs, in dem Fall eben void blabla();.

Xmas
2004-02-02, 17:25:08
Ich versteh das Problem nicht ganz. Windows fordert von Callbacks die CALLBACK-Konvention (welche üblicherweise __stdcall entspricht), aber das heißt doch noch lange nicht dass du für deine Callbacks CALLBACK nutzen musst.

Einfachkrank
2004-02-02, 19:18:57
Ich glaub ich hab da was falsch verstanden, was es mit dem __stdcall auf sich hat. Kann mir das noch mal einer von euch genau erklären? Afaik gibt es da doch noch jede Menge von diesen Dingern, die mit zwei Unterstrichen anfangen? Ich kannte bis vor kurzem nur den __asm. Was gibts denn da noch alles und für was kann ich die denn verwenden? Und sind das eigentlich allgemein gültige C++ Programmiertechniken oder sind die MS-spezifisch?

Xmas
2004-02-02, 19:35:57
Bezeichner die mit zwei Unterstrichen anfangen, sind mit Sicherheit Compiler-spezifisch.

__stdcall, __cdecl (Defaultwert), __fastcall, thiscall (hat keinen eigenen Bezeichner, default für Methoden) sowie die veralteten __pascal, __fortran und __syscall sind sogenannte Calling Conventions. Sie legen fest, auf welche Weise Parameter und Rückgabewerte übergeben werden, und wer den Stack aufräumt.

Parameter können z.B. von rechts nach links oder andersrum übergeben werden, über den Stack oder festgelegte Register. Der Stack kann entweder von der aufrufenden oder von der aufgerufenen Funktion aufgeräumt werden.

Wie du an den Bezeichnern __pascal und __fortran erkennst, wird dies in verschiedenen Programmiersprachen auf unterschiedliche Weise gemacht. Will man nun unterschiedliche Funktionen zusammenarbeiten lassen, muss man sich auf eine Calling Convention einigen. Sonst werden die Parameter in der falschen Reihenfolge, oder an der falschen Stelle übergeben.

Trap
2004-02-02, 20:13:06
Guck mal auf http://www.boost.org/doc/html/signals.html

Das macht wahrscheinlich genau das was du haben möchtest, nur viel allgemeiner und sicherer.

Gast
2004-02-02, 23:12:34
http://www.function-pointer.org