Refernzen auf Referenzen sind erlaubt?
-
Ich habe in einem Buch gelesen, dass Referenzen auf Referenzen NICHT erlaubt sind.
Diese beiden Funktionen verwende ich:
bool save(FILE* Datei, Dreieck& source); // source ist eine Referenz auf einen // Speicherbereich, der dem Aufrufer gehört bool print(Dreieck& source); // hier gilt das genausoDabei wäre noch anzumerken, dass die print-Funktion nichts anderes tut als das:
bool print(Dreieck& source){ return save(stdin,source); }Der Compiler (bzw. Linker) beschwert sich aber überhaupt nicht darüber!
Es tritt auch kein Runtime-Fehler oder eine Access-Violation oder ähnliches dabei ein, wenn ich beispielsweise in der main Folgendes schreibe:int main(){ Dreieck Tri; FILE* dz = fopen("Mein_Dreieck.txt","r"); // Öffne die Datei load(dz, Tri); // Lade aus dz die Eckpunkte in die Struktur Tri print(Tri); // Zeige die Eckpunkte auf dem Bildschirm an fgetc(stdin); // Verzoegere das Schließen des Konsolenfensters return 0; }Der Funktionsaufruf print(Tri) müsste ja jetzt eigentlich zu einer 'Referenz auf eine Referenz' führen, weil ja print(Dreieck&) nichts anderes tut, als die Referenz an eine Funktion weiter zu reichen, die ebenfalls einen Parameter als Referenz bekommt, nämlich save(FILE* datei, Dreieck&).
Weder der Compiler noch der Linker (MS VC++ 2003) weigern sich, das Projekt zu einer .exe Datei zu kompilieren.
Es tritt beim Ausführen der .exe Datei auch kein Runtime-Fehler oder eine Access-Violation auf.
Das Buch behauptet aber: Eine Referenz auf eine Referenz ist verboten.Wer täuscht sich denn jetzt? Das Buch? Der Compiler/Linker? Oder gilt womöglich diese Regel im Falle von 'als Referenz übergebenen Parametern' gar nicht? Weil leider steht das nirgendwo, dass das ein Ausnahmefall wäre!
Es wäre schön, wenn mir jemand genauer erklären könnte, ob diese Buch-Regel: 'Eine Referenz auf eine Referenz ist verboten' genauer erklären könnte!
Weil womöglich hält sich auch mein Compiler einfach nicht an die Buch-Regel.Danke für Tipps!
-
Reverend schrieb:
Dabei wäre noch anzumerken, dass die print-Funktion nichts anderes tut als das:
bool print(Dreieck& source){ return save(stdout,source); }Ausgebessert, natürlich stdout statt stdin
-
Die Funktion erwartet eine Referenz als Parameter, diese lieferst du. Es wird also einfach die übergebene Referenz verwendet, ohne, dass erneut referenziert wird?
Mit freundlichen Grüßen
-
bool save(FILE* datei, Dreieck& source); // Der Parameter source ist eine // Referenz auf ein Objekt vom Typ 'Dreieck' bool print(Dreieck& source){ // Hier ebenfalls! return save(stdout, source); // source ist eine Referenz auf ein 'Dreieck' // Als Folge muesste doch die Funktion 'save' eine Referenz auf // eine Referenz überreicht bekommen, was angeblich nicht erlaubt // sein soll (zumindest laut Buch! der Compiler sieht das nicht so eng) }Deshalb habe ich mich gefragt, ob der Compiler womöglich 'beide Augen zudrückt' und 'weiß, was ich möchte', aber es laut Buch-Standard eigentlich nicht tun sollte.
-
eine "referenz auf eine referenz" ist nicht das durchreichen einer referenz an eine weitere methode. eine referenz auf eine referenz wäre sowas wie
void someMethod(void &¶m);und mal davon abgesehen, dass "&&" bereits vorbelegt ist als "logisches und", ist sowas schlicht nicht vorgesehen/erlaubt. gegensatz wäre sowas wie **int, ein pointer auf einen pointer. referenzen sind keine pointer.
-
thordk schrieb:
eine "referenz auf eine referenz" ist nicht das durchreichen einer referenz an eine weitere methode. eine referenz auf eine referenz wäre sowas wie
void someMethod(void &¶m);und mal davon abgesehen, dass "&&" bereits vorbelegt ist als "logisches und", ist sowas schlicht nicht vorgesehen/erlaubt. gegensatz wäre sowas wie **int, ein pointer auf einen pointer. referenzen sind keine pointer.
Alles klar! Thx
-
&a = &b
-
ist das nicht referenz auf referenz? bei mir geht das ohne probleme
int c = 1234; int &a = c, &b = a;
-
hehe schrieb:
ist das nicht referenz auf referenz? bei mir geht das ohne probleme
int c = 1234; int &a = c, &b = a;Nein.
a ist eine Referenz auf c und b ist eine referenz auf c. Da eine Referenz im Grude ein Alias ist, ist &b = a das gleiche wie &b = c in diesem Beispiel.