Pointerübergabe per Referenz

MadJoe

MadJoe

Eroberer
hallo zusammen!

habe ein sehr ungewöhnliches problem mit zeigern:
ich versuche einen zeiger per referenz zu übergeben, z.b:

Code:
void printInteger(int* &ptrInteger)
{
     cout << *ptrInteger << endl;
}

int main(int argc, char** argv)
{
     int* i = new int;
     *i = 100;
     printInteger(i);
     return(0);
}

ich habe das mal in dieser form getestet, um überhaupt zu überprüfen ob das generell funktioniert, mit erfolgt.

jetzt wird man sich fragen, warum ich so etwas seltsames überhaupt machen will, nun die idee dahinter ist bei einem serialisierungssystem pointer adressen in objekte festzulegen um verknüpfungen zwischen objekten beim laden wieder dynamisch herzustellen. (könnte es natürlich auch mit ** pointer und &pointer übergeben, aber ist wohl eine estetische sache, wenns denn klappt)

verwende ich das jetzt im größeren zusammenhang, z.b. mit einer abstrakten basisklasse ISerializable, und möchte dieses dann in der Form "ISerializable* &object" übergeben so erkennt es der compiler zwar ohne meckern an, jedoch wird die funktion einfach nicht aufgerufen, wenn ich das programm ausführe (sicher festgestellt durch wxMessageBoxes und couts usw.)

vielleicht noch zu erwähnen, dass es folgende überladungen für meine write-funtkionen gibt:

BinarySerializer::write(ISerializable &object);
BinarySerializer::wirte(ISerializable* &object);

hat den irgendjemand erfahrungen mit solch einem problem gemacht oder irgendwelche hinweise, die mir weiter helfen könnten?

gegoogelt hab ich schon paar mal, aber allein unter pointer per referenz übergeben findet man eigentlich nichts brauchbares, verwendet vermutlich auch sonst niemand

mfg madjoe
 
Zuletzt bearbeitet:
Davon abgesehen, dass es in Deinem Beispiel in main
*i = 100;
heissen muss, tut Dein Code ja. Kannst Du vielleicht ein Beispiel angeben, in dem Dein Problem deutlich wird? Mir faellt nicht ein, warum man Zeiger nicht als Referenzen uebergeben koennen sollte, von daher waere eben ein Programm, das sich _nicht_ so verhaelt wie erwartet, lehrreicher.

Hast Du es mal mit gdb versucht, um rauszufinden, was an der entsprechenden Stelle geschieht, und wieso der Funktionsaufruf uebersprungen wird?
 
rikola schrieb:
Davon abgesehen, dass es in Deinem Beispiel in main
*i = 100;

ja sorry, hab das mal schnell runtergeschrieben, anstatt zu kopieren, ja wie schon gesagt, wie zu lesen ist, habe ich dieses beispiel ja eh mit erfolg ausprobiert. nur mit der variante, wo er implizit in einen basetyp konvertieren muss geht es offensichtlich nicht, zumindest in der praxis, weil der compiler meckert net beim übersetzten...

ich könnte jetzt zwei tonnen source reinstellen, ist aber net so interessant, von daher werde ich jetzt ein kleines ableitungsbeispiel zusammenbauen, im gleichen umfang wie meinen integer test

EDIT:

so, hab mein problem wieder mal selbst gelöst...
es ist kein implizites casting zwischen zeigern verschiedenen typs in der ableitungshierarchie möglich, offensichtlich kann man doch nicht alles vom compiler erwarten, nun, hab das jetzt aber mittels void* gelöst und übergebe meinen zeiger mittels &zeiger
 
Zuletzt bearbeitet:
Aber warum denn erst einen Zeiger auf die Instanz einer Klasse als Referenz übergeben, wenn dieser doch bereits das Objekt selbst referenziert ?!
 
x0r schrieb:
Aber warum denn erst einen Zeiger auf die Instanz einer Klasse als Referenz übergeben, wenn dieser doch bereits das Objekt selbst referenziert ?!

meine idee ist, die adresse des zugrundeliegenden pointers zu ändern (z.b. wenn er mitglied einer serialisierbaren klasse ist, um alle bezüge von dynamisch generierten objekten wiederherzustellen, wenn der binäre datenstrom wieder eingelesen wird... also muss ich, wenn ich von fremder stelle die bezüge herstellen will die pointer in der entsprechenden klasse selbst beschreiben können (also **-pointer) bzw. referenz hätte es eben getan, weil man dann das & vor der übergabe weglassen kann... zu verdeutlichung, es sei persistentDataEvent die readin-funktion einer serialisierbaren klasse:

Code:
void MeineKlasse:persistentDataEvent(IUnserializer &u)
{
      u.read(m_prtLinkToOriginalObject); // bzw. jetzt &m_ptrLink....
}

also beim writeout-prozess wurde hier ein pointer zum objekt XY gefunden, welches schon ein paar mal vorher in der objekthierachie mit der gleichen adresse als XY erkannt wurde, jetzt wurde beim einlesen ein objekt vom IUnserializer selbst generiert, dass das ursprüngliche objekt XY darstellt und der pointer in dieser klasse muss jetzt wieder auf das neue objekt XY zeigen, so wie er es auch in anderen objekten der objekthierachie schon tut
 

Ähnliche Themen

NagiosGrapher 1.7.1 funktioniert nicht

Übergeben von Zeigern an Funktionen

CGI laesst sich nicht ausfuehren

Zurück
Oben