GNU C++ Methoden typen signatur

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
TheRealISA
Beiträge: 3
Registriert: 29.10.2007, 15:01

GNU C++ Methoden typen signatur

Beitrag 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
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: GNU C++ Methoden signatur

Beitrag 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
Benutzeravatar
dot
Establishment
Beiträge: 1748
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: GNU C++ Methoden typen signatur

Beitrag 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 ;)
Benutzeravatar
Schrompf
Moderator
Beiträge: 5231
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: GNU C++ Methoden typen signatur

Beitrag von Schrompf »

Der Grund, dass man Pointer-To-Member nicht auf void* casten kann, ist darin begründet, dass ein Zeiger zu klein ist.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1748
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: GNU C++ Methoden typen signatur

Beitrag 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 ;)
gdsWizard
Establishment
Beiträge: 237
Registriert: 04.02.2005, 09:12
Benutzertext: www.gamedevstudio.com
Echter Name: Thomas Mittelsdorf
Wohnort: Meiningen
Kontaktdaten:

Re: GNU C++ Methoden typen signatur

Beitrag 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
TheRealISA
Beiträge: 3
Registriert: 29.10.2007, 15:01

Re: GNU C++ Methoden typen signatur

Beitrag 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:

Code: Alles auswählen

.def("t", (void(TestClass::*)(int)) &TestClass::test)
(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
TheRealISA
Beiträge: 3
Registriert: 29.10.2007, 15:01

Re: GNU C++ Methoden typen signatur

Beitrag von TheRealISA »

@gdsWizard

Ja genau! Habe nicht nach dem richtigen Stichwort geguckt :D (s.o.)
(crosspost)
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: GNU C++ Methoden typen signatur

Beitrag 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;
:)
Benutzeravatar
dot
Establishment
Beiträge: 1748
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: GNU C++ Methoden typen signatur

Beitrag 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...
Antworten