void* auf eigenen Typ casten

Decelion

Grünschnabel
Hi allerseits.
Ich programmiere schon einige Zeit in c++, meist kleinere Sachen, habe die Sprache jedoch noch nie "gezielt" gelernt. Jetzt will ich das ganze mal etwas geplanter angehen und mir die GTK+ 2.0 Bibliothek etwas genauer ansehen, sowie etwas Erfahrung mit der Sprache gewinnen.
Ich bin jetzt jedoch auf ein Problem gestoßen, dass ich weder mit Dirk Louis' C/C++ Kompendium, noch Allmeister Google, noch der Forensuche lösen konnte.
In GTK wird beim Klick-Ereignis auf einen Button an die aufgerufene Funktion der Zeiger zum geklickten Button sowie ein Zeiger vom Typ gpointer (nicht gpointer* ) übergeben. gpointer sollte auf die Informationen zeigen, die ich in der Funktion verarbeiten will, die Funktion selbst ist vom Typ void. Da ich der Funktion mehrere Informationen übergeben will, habe ich diese in einer eigenen Klasse zusammengefasst. Beim Klick-Event übergebe ich der Funktion statt des gpointers einen Zeiger auf eine vorher erstellte Instanz dieser Klasse. Vom Typ gpointer caste ich das Ganze dann auf void*, was auch wunderbar funktioniert.
Nun habe ich also einen void-Zeiger zu der Stelle, an der die gewünschte Instanz meiner Klasse steht - Wie kann ich c++ jetzt mitteilen, dass es diesen Zeiger als Zeiger vom Typ meiner eigenen Klasse betrachten soll? Das ganze ist eigentlich eine sichere Angelegenheit, ich kenne die genaue Adresse und den Typ, nur c++ kennt den Typ nicht und gibt mir bei verschiedenen Castingmöglichkeiten entweder beim Übersetzen die Info, dass ich das nicht darf, oder gibt mir bei anderen Castingmöglichteiten zur Laufzeit die Info, dass das nicht möglich ist. Kann ich dem Compiler (g++) irgendwie mitteilen, dass das mit dem Datentyp an der Stelle schon stimmt?
Oder gibt es andere, elegantere Möglichkeiten, als der ganze casting-Wust?

lg und schonmal Danke fürs Durchlesen
Dece
 
Hi und Willkommen bei tutorials.de,

Mir ist die Situation noch nicht ganz klar.
---
Du hast eine Funktion, der ein void* übergeben werden soll.
Da soll eine eigene struct/class durch.
Die Adresse dazu hast du "nur" als gpointer, deshalb castest du bei der Übergabe zu void*
Und in der Funktion weißt du jetzt nicht, wie du so castest, dass du deine Klasse wieder hast?
---
Richtig so?

Was hast du denn bisher probiert, was Fehler ergeben hat? (Welche Fehler?)

Wenn die Klasse Klasse und die übergebene Variable voidvar heißt:
C++:
Klasse *neuevar = (Klasse *)voidvar;
Einfach so.
Zugriff dann:
C++:
neuevar->methode(123);
//oder, andere Schreibweise
(*neuevar).methode(123);

PS: Ah ja, das ist ja C++ :D
 
Das es eine elegantere Möglichkeit gibt kann schon sein, mir fällt jetzt auf die Schnelle leider keine ein.
Aber für eine Konversation von void* in einen anderen Pointertyp, sollte es eigentlich mit einem static_cast getan sein.

C++:
Sth *a;            // Angenommen a zeigt schon auf ein geeignetes Objekt
void *b;
MyClass *c;

b = a;                    // Der Compiler castet automatisch zum void*
c = static_cast <MyClass*> (b);         // Das Casten von void* auf einen andere Pointertyp funktioniert nicht automatisch. Hier musst du den static_cast verwenden

Lg
 
Danke, habs hinbekommen. Wie ihr es vorgeschlagen habt, hatte ich es versucht - Problem war nur, dass der Compiler das nicht zulassen wollte. Dadurch, dass die Vorschläge nochmal von euch kamen, wurde ich aber in meinem Denken, dass es so funktionieren muss bestärkt - und nach noch einer Runde exzessiven rtfm habe ich dann die Option -fpermissive gefunden - damit läufts.

Danke für eure Hilfe!

(Wenn dennoch jemand eine Idee hat, wie das eleganter geht.. So funktioniert es zwar, doch es kommt mir irgendwie etwas dreckig vor ;) )
 
Dadurch, dass die Vorschläge nochmal von euch kamen, wurde ich aber in meinem Denken, dass es so funktionieren muss bestärkt - und nach noch einer Runde exzessiven rtfm habe ich dann die Option -fpermissive gefunden - damit läufts.
Ganz schlechte Idee. Durch diese Option wird eigentlich ungültiger Code trotzdem zugelassen, was schwer zu findenden Bugs Tür und Tor öffnet. Das ist keine Lösung des eigentlichen Problems.

(Wenn dennoch jemand eine Idee hat, wie das eleganter geht.. So funktioniert es zwar, doch es kommt mir irgendwie etwas dreckig vor ;) )
Ist es auch. Ohne Quellcode und/oder genaue Fehlermeldungen des Compilers können wir dir da aber nicht helfen.

Grüße,
Matthias

P.S.: Ein gpointer ist nichts anderes als ein anderer Name für void*, von gpointer auf void* casten ist also unnötig.
P.P.S.: Wenn du C++ lernen willst und nicht C, dann wäre gtkmm angebrachter. Damit muss man auch nicht mit untypisierten Zeigern um sich werfen.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück