PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C/C++ Klassen-Methode als Zeiger-Parameter an eine C-Funktion?



Beatkiller
07-03-2005, 19:59
Hallo,

ich suche nach einer Möglichkeit, den Zeiger auf eine Klassen-Methode als Parameter an eine C-Funktion zu übergeben.

Die C-Funktion kann man von der Klasse aus aufrufen.

Ich stelle es mir so vor:


//cfoo.h
extern "C" cfoo(void *func);

//cfoo.c
cfoo(void *func)
{
func->bar(4);
}


// foo.h
class foo
{
public:
void *bar(int x);
};

//foo.cpp

void*
foo::bar(int x)
{
cout << x << endl;
}

Leider bekomme ich ein Problem, das der Parameter der C-Funktion den Zeiger auf void*foo::bar(int) nicht annimmt.

Ich hoffe, es versteht jemand, wie ich das meine. Auch wenn es sehr obskur ist, hoffe ich, das es eine Lösung dafür gibt.

PS: Bitte nicht hauen, ich fang grad erst mit C++ an ;)

Gruß

panzi
07-03-2005, 20:26
wills jetzt net ausprobieren, aber vieleicht geht das:

//cfoo.h
extern "C" cfoo(void *func);

//cfoo.c
#include <cfoo.h>
#include <foo.h>

cfoo(void *func)
{
static_cast<foo*>(func)->bar(4);
}


// foo.h
class foo
{
public:
void bar(int x);
};

//foo.cpp

void
foo::bar(int x)
{
cout << x << endl;
}

Beatkiller
08-03-2005, 18:08
Hallo,

erstmal Danke für den Tipp. Leider ist die C-Funktion so aufgebaut, das auch Pointer anderer Klassen akzeptiert werden müssen (z.B. foo1, foo2....).

Mit dieser Methode würde ja nur die Klasse "foo" akzeptiert werden, stimmts?

Sorry, bin mit C++ noch nicht sonderlich firm.

Gruß

Joghurt
08-03-2005, 19:07
Nur so zu Info. Jede Methode bekommt als ersten parameter implizit die Klasse übergeben (this).

MyClass foo;
foo.methode(42); // =~ foo::methode(&foo, 42);

panzi
09-03-2005, 12:37
Hallo,

erstmal Danke für den Tipp. Leider ist die C-Funktion so aufgebaut, das auch Pointer anderer Klassen akzeptiert werden müssen (z.B. foo1, foo2....).

Mit dieser Methode würde ja nur die Klasse "foo" akzeptiert werden, stimmts?

Sorry, bin mit C++ noch nicht sonderlich firm.

Gruß
Andere Klassen aber immer die selbe Methode die aufgerufen wird? Dann leite die anderen Klassen ab, mach die methode virtual (in Basisklasse pure virtual) und caste zu nen Basisklassenpointer.

wraith
09-03-2005, 13:50
ich suche nach einer Möglichkeit, den Zeiger auf eine Klassen-Methode als Parameter an eine C-Funktion zu übergeben.
C kennt keine Klassen und keine Methoden, also was willst du damit erreichen?
Übergib es einer C++ Funktion, und schon sieht die Sache ganz anders aus.

Der Hinweis von Joghurt ist aber schonmal wichtig, weil auch eine Methode nur eine Funktion ist, mit ersten Parameter this.


#include <iostream>
#include <stdarg.h>

using namespace std;

void doit(int intarg,void *pClass,...)
{
typedef void(*pf)(void*,int);

void (*vpfun)(void);
va_list ap;
va_start(ap,pClass);

vpfun = va_arg(ap,void(*)());

((pf)vpfun)(pClass,intarg);

va_end(ap);
}

class AClass
{
int k;
public:
AClass(int kk) : k(kk) {}
void foo(int i) {
cout << "AClass::foo " << i << " ... " << k << endl;
}
};

class AnotherOne
{
public:
void bar(int i) {
cout << "AnotherOne::bar " << i << endl;
}
};

int main()
{
AClass foo(-1234);
AnotherOne bar;

void (AClass::*pmfac)(int) = &AClass::foo;
void (AnotherOne::*pmfao)(int) = &AnotherOne::bar;

doit(4711,&foo,pmfac);

doit(7660,&bar,pmfao);
}

Das ist schon derbe hässlich. Funktioniert auch nur gerade so.
Gibt vielleicht noch eine bessere Variante, aber wer braucht sowas?