Seite 1 von 1
GNU C++ Methoden typen signatur
Verfasst: 12.12.2011, 19:48
von TheRealISA
Hallo Forenbesucher.
Ich hoffe dass ich hier einen C++-Nerd antreffe, der mir bei einem kleinen Problem helfen kann. Es geht dabei um folgendes:
*vereinfachtes Problem skizzier*
Code: Alles auswählen
class TestClass {
// [...]
virtual void test(int i) {
cout << "This is TestClass::test(i) with i = " << i << endl;
}
virtual void test(string s) {
cout << "This is TestClass::test(s) with s = " << s << endl;
}
};
int test() {
void* ptr = &TestClass::test; // Dem geübten Auge wird nicht entfallen, dass dies nicht geht, da der compiler nicht weiß ob test(int) oder test(string) gemeint ist
}
Habe im internet schon einen Haufen Sachen gefunden, aber leider nicht einer der gefundenen Artikel präsentier die richtige Typensignatur für Methoden eines Objektes. Habe schon druch:
Code: Alles auswählen
&((void(int)) TestClass::test)
&((void(TestClass*, int)) TestClass::test)
&((void(TestClass&, int)) TestClass::test)
Aber all dies mochte mein g++ nicht. Weiß wer die Antwort?
TheRealISA
Re: GNU C++ Methoden signatur
Verfasst: 12.12.2011, 19:52
von Artificial Mind
Hallo,
zuerst einmal: du kannst pointer auf member-Funktionen keinem void pointer zuweisen.
Ansonstent kannst du dir das hier angucken:
http://www.java2s.com/Code/Cpp/Function ... ctions.htm (nicht vom java in der URL stören lassen),
das sollte genau deinem Problem entsprechen.
Falls du doch nen void* brauchst kann ich dir ne echt fiese Methode nennen wie das geht, aber nur wenn dus brauchst^^
Cheers,
Mind
Re: GNU C++ Methoden typen signatur
Verfasst: 12.12.2011, 19:57
von dot
Ich denk die zuerstmal allerwichtigste Frage ist: Warum in Gottes Namen ein void*?
Wie bereits gesagt wurde geht das schon rein prinzipiell sowieso nicht. Aber abgesehen davon willst du ja C++ und in C++ willst du void* wenn dann überhaupt nur in eher seltenen Ausnahmefällen (z.B. type erasure) sehen...
Erklär uns vielleicht mal was genau du eigentlich machen willst. Zeiger auf Methoden unterscheiden sich rein prinzipiell von Funktionszeigern, da du ja ein Objekt brauchst um eine Methode aufzurufen ;)
Re: GNU C++ Methoden typen signatur
Verfasst: 12.12.2011, 20:12
von Schrompf
Der Grund, dass man Pointer-To-Member nicht auf void* casten kann, ist darin begründet, dass ein Zeiger zu klein ist.
Re: GNU C++ Methoden typen signatur
Verfasst: 12.12.2011, 20:13
von dot
Schrompf hat geschrieben:Der Grund, dass man Pointer-To-Member nicht auf void* casten kann, ist darin begründet, dass ein Zeiger zu klein ist.
Wobei das von der Klasse und Art des Members abhängt ;)
Re: GNU C++ Methoden typen signatur
Verfasst: 12.12.2011, 20:13
von gdsWizard
Hallo,
ich denke du suchst Member Function Pointer. Wenn ja dann schau mal nach
http://www.codeproject.com/KB/cpp/FastDelegate.aspx
gdsWizard
Re: GNU C++ Methoden typen signatur
Verfasst: 12.12.2011, 20:16
von TheRealISA
Ja... das ist Teil der "simplifizierung". Eigentlich gehört der ganze Abschnitt in ein kleines Testprogramm in dem ich mit luabind experimentiere. Allerdings erschien mir der Abschnitt:
Code: Alles auswählen
{
using namespace luabind;
module(mainState) [
namespace_("pkg") [
class_<TestClass>("TCls")
.def(constructor<>())
// .def("t", (void (*)(int)) (& (void(int) TestClass::test))) <- hier der Überltäter und mein letzter Unsinn
]
];
}
ein wenig zu unübersichtlich um ihn hier zu posten.
@Artificial Mind
Ist leider nicht ganz das was ich suche. Function pointers (mit ihrer grausligen syntax :D) kenne ich schon. Ich brauch tatsächlich pointer auf Member-Funktionen, was durchaus möglich ist/sein sollte. Aber die Tipps haben mich in der Tat auf die richtige Fährte gebracht, und das Problem ist, dass ich doch noch nicht alle grausligen Eigenarten von Functionpointer kannte scheinbar, und man in der Tat keine "void"-Zuweisung in der Form machen kann.
Das war wohl in Konzeptfehler in meinem Fehler-Testprogramm, danke Leute!
In jedem Fall um auf den luabind-code zurück zu kommen, dashier ist die Lösung für besagte Zeile:
(das Sternchen hinter :: dem hätte ich niemals so geschrieben, wenn ich nicht nochmal nach Method pointern
http://mdzahidh.wordpress.com/2008/07/1 ... -pointers/ geguckt hätte)
Besten Dank nochmal, ich finde es relativ tricky alle Varianten der C++ Syntax im Kopf zu behalten/zu erlernen
Re: GNU C++ Methoden typen signatur
Verfasst: 12.12.2011, 20:17
von TheRealISA
@gdsWizard
Ja genau! Habe nicht nach dem richtigen Stichwort geguckt :D (s.o.)
(crosspost)
Re: GNU C++ Methoden typen signatur
Verfasst: 12.12.2011, 20:54
von Artificial Mind
Falls es wen interessiert:
Member function pointer to void pointer:
Code: Alles auswählen
union BrutalCast
{
void(TestClass::* mp)(int);
void *vp;
}
BrutalCast brutal;
brutal.mp = &TestClass::test;
void *voidPointerToMemberFunction = brutal.vp;
:)
Re: GNU C++ Methoden typen signatur
Verfasst: 12.12.2011, 21:30
von dot
Das ist aber nichts destro trotz undefiniertes Verhalten und wird je nach Klasse und Member potentiell auch tatsächlich crashen da void* unter Umständen zu klein ist um einen Memberpointer zu speichern. Würd ich also auf keinen Fall so machen...