C++: Klassen-Adresse in Konstruktor

Hi,

angenommen ich bin im Konstruktor einer Klasse, (wie) kann ich dort die Adresse des gesamten Objektes herausbekommen?
Wenn das moeglich ist, ermoeglicht mir das den Aufruf einer Memberfunktion mittels Objekt->memberfunction(parameters…) ?
Falls nicht, lässt sich das irgendwie erreichen (dieser Spezielle Parameter laesst sich zumindest durch Aufruf des Konstruktors mittels Klasse Objekt(&Objekt) uebergeben, da das Objekt da noch garnicht erzeugt ist …)
Was ich vorhabe it zugegebenermassen ein furchtbarer Hack. Das Objekt soll durch einlesen eines TCL-Scriptes initialisiert werden, das Script ruft wiederum eine C-Funktion auf, die dann die Memberfunktion aufruft und die Variablen-Werte aus dem Script setzt. Ich weiss nicht, ob das alles ueberhaupt laufen kann, wollte es aber versuchen. Dadurch steht in der Ini-Datei ein fabelhafter Syntax zur Verfuegung ohne das ich mich gross drum kuemmern muesste. Falls mein Plan voellig unbrauchbar ist - gibt es andere Moeglichkeiten sowas zu erreichen? Es muss doch massig tools zum einlesen von Ini-Dateien geben … Ich bin halt ein Tcl-User und daran gewoehnt, aber was anderes wuerde es notfalls auch tun.
Fragen ueber Fragen und schonmal ein dickes Dankeschoen im Voraus :wink:

Gruss

Thorsten

Verstehe ich das richtig? Du willst dem TCL-Skript die Adresse des Objekts uebergeben. Dann soll das TCL-Skript diese Adresse einer C-Funktion uebergeben, die dann diese Objekt maniuplieren soll?

Wenn Du das so gemeint hast, dann gibt es nur noch ein Problem: Die C-Funktion muss in dem Prozess aufgefuehrt werden, in dem auch das Objekt erstellt wurde. Sonst hat die C-Funktion ueberhaupt gar keinen Zugriff auf diese Adresse. Ich weiss zwar nicht, wie Du die C-Funktion von TCL aus aufrufst (ich weiss praktisch nix von TCL), aber die wird vermutlich in einer DLL sein oder so.
In diesem Fall wird aber die C-Funktion im Prozess des TCL-Interpreters (wish oder wie der heisst) ausgefuehrt, d.h. Du hast keinen Zugriff auf diese Adresse (jedenfalls wuesste ich nicht wie das gehen sollte, falls jemand da was anderes weiss, waere ich sehr daran interessiert).
Es gibt aber dennoch etliche Moeglichkeiten Daten zwischen verschiedenen Prozessen auszutauschen. Das MSDN nennt da z.B. DDE, Atoms, Mailslots, Pipes und File Mapping. Ich hab mal bei einem aenlichen Problem File Mapping verwendet. Da koennen mehrere Prozesse auf einen gemeinsamen Speicherbereich zugreifen. Du brauchst dazu u.a. die Windows-Funktionen CreateFileMapping und MapViewOfFile.

Werd jetzt da nicht mehr dazu sagen, da ich nicht mal weiss, ob ich Dein Problem richtig verstanden habe.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

Verstehe ich das richtig? Du willst dem
TCL-Skript die Adresse des Objekts
uebergeben. Dann soll das TCL-Skript
diese Adresse einer C-Funktion
uebergeben, die dann diese Objekt
maniuplieren soll?

Das war genau der Plan.

Wenn Du das so gemeint hast, dann gibt es
nur noch ein Problem: Die C-Funktion muss
in dem Prozess aufgefuehrt werden, in dem
auch das Objekt erstellt wurde. Sonst hat
die C-Funktion ueberhaupt gar keinen
Zugriff auf diese Adresse.

Ich verwende das ganze unter Linux, da iss nix mit DLL. Man kann in C Strukturen generieren, die ein TCL-Script auswerten koennen, dazu brauch man keine Childs (heisst bei Windows vermutlich anders, unterprozesse oder so) zu generieren. Es ist moeglich aus C auf Variablen aus dem Script zuzugreifen und umgekehrt, so funktioniert der Transport der Adresse (wenn ich denn an sie rankomme) und auch der Parameter-Werte. Ausserdem lassen sich neue Funktionen generieren, die dann im Script zur Verfuegung stehen. Ich setze also im Script haufenweise Variablen und rufe am Ende eine C funktion auf. Diese C-Funktion ruft ihrerseits (mit Hilfe der Adresse, die vom Script uebergeben wird) eine memberfunction auf, die die Werte aus dem Script liest. Dabei laesst sich auch sehr einfach sicherstellen, dass alle Parameter gesetzt wurden, und dass sie den passenden Typ haben (bool, int usw). Ich brauche aber die membewrfunktion, da nur sie auf die Objekt-Variablen zugreifen kann. Ich weiss nicht ob oder wie ich Memberfunktionen im Script zur Verfuegung stellen kann, daher versuche ich den Hack mit der Adresse. Diese geht als int durchs Script. Da alles im gleichen Prozess laeuft brauche ich keine Pipes oder aehnliches (waere mir in diesem Fall auch zu umstaendlich).
Kann ich nun an die Adresse rankommen?

Gruss

Thorsten

Hi nochmal,

mir ist gerade eine Idee gekommen, vielleicht brauche ich die Funktion, die Parameter aus dem Script liesst garnicht aus dem Script aufzurufen. Evtl kann ich die Parameter nach Auswertung des Scriptes aus den Strukturen lesen, die das Script ausgewertet haben. Ich werde das morgen (naja, heute …) mal testen. Sollte das Problem damit geloest sein, poste ich das morgen (heute).

Vielen Dank schonmal fuer die Antwort!

Thorsten

Kann ich nun an die Adresse rankommen?

Sorry, hatte ich ganz vergessen zu schreiben. Natuerlich enthaelt this die Adresse. Die Adresse kannst Du z.B. in einen int umwandeln:

int a = (int)this;

Und dann als int irgendeiner Funktion uebergeben.

Problem geloest
Hi,

die Funktion muss tatsaechlich nicht aus dem Tcl-Script aufgerufen werden, es genuegt das Script auszuwerten und dann die Struktur Tcl_Interp *interp an eine Funktion zu uebergeben, die daraus die Parameter liesst. Das ganze ist jetzt fertig und bietet nun eine sehr flexible und praktische Moeglichkeit, Parameter aus Ascii Files zu lesen - sehr zur Nachahmung empfohlen.
Mit this haette es uebrigens vermutlich Probleme gegeben, ich habe da was getestet und habe ein SIGSEG gekriegt, sobald die memberfunction auf Klassenvariablen zugreift. Oben habe ich dazu noch einen Artikel gepostet.
Vielen Dank fuer die Hilfe!

Gruss

Thorsten