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ß
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ß
Nur so zu Info. Jede Methode bekommt als ersten parameter implizit die Klasse übergeben (this).
MyClass foo;
foo.methode(42); // =~ foo::methode(&foo, 42);
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.
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?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.