reference auf array initialisieren



  • Hallo,

    wie kann ich denn eine Referenz auf ein Array initialisieren, also z.B.

    int (&test)[2];

    Das würde zum Fehler:
    Fehler: »test« als Referenz deklariert, aber nicht initialisiert

    führen. Wie muss ich denn initialisieren? Im Konstruktor?

    Vielen Dank,
    Gordon



  • Also ich persönlich finde ja das Arrays und Referenzen nicht zusammen gehören 😛
    Arrays und Pointer agieren wunderbar zusammen und sind gar nicht so schwer zu verstehen 😉



  • grobian schrieb:

    ...wie kann ich denn eine Referenz auf ein Array initialisieren, also z.B.

    int (&test)[2];

    ...

    So wie alle Referenzen:

    int arr[2] = {1, 2};
       int (&refs)[2] = arr;
    

    Referenzen müssen bereits bei ihrer "Entstehung" gebunden werden, d.h. bei einem Klassenmember in der Initialisierungsliste:

    struct A {
       int (&refs)[2];
       A(int (&arr)[2]) : refs(arr) {}
    };
    

    Aaaaaaaber: Müssen es wirklich Arrays sein ? Warum kein STL-Container (vector, ....) ?

    Speedy_92 schrieb:

    Also ich persönlich finde ja das Arrays und Referenzen nicht zusammen gehören 😛
    Arrays und Pointer agieren wunderbar zusammen und sind gar nicht so schwer zu verstehen 😉

    Naja, er will ja kein Array von Referenzen (was IIRC nicht geht), sondern eine Referenz auf ein Array.... da spricht IMHO nichts gegen (obwohl ich Arrays zunehmend für verzichtbare Altlast halte).

    Gruß,

    Simon2.


  • Mod

    Referenzen als nichtstatische Klassenmember sind fast immer ein Fehlgriff.



  • camper schrieb:

    Referenzen als nichtstatische Klassenmember sind fast immer ein Fehlgriff.

    Warum? Wenn ich eine Hilfsklasse hab, die jeweils genau 1 Hauptklassenelement bedient, find ich Referenzen sehr praktisch. Wuerd ich das mit einem Pointer machen wollen kann mir keiner garantieren, dass der nicht aus Versehen mal NULL ist.



  • Du hast Probleme beim Kopieren, falls notwendig. Und Referenzen können genauso ungültig werden wie Pointer, und in diesem Fall kannst du sie nicht mal auf NULL setzen um anzuzeigen, dass sie ungültig sind.

    Wenn du das Lebenszeit-Problem im Griff hast und keine Zuweisung brauchst oder diese nicht definierbar wäre, mag es imho okay sein.


  • Mod

    Blue-Tiger schrieb:

    camper schrieb:

    Referenzen als nichtstatische Klassenmember sind fast immer ein Fehlgriff.

    Warum? Wenn ich eine Hilfsklasse hab, die jeweils genau 1 Hauptklassenelement bedient, find ich Referenzen sehr praktisch. Wuerd ich das mit einem Pointer machen wollen kann mir keiner garantieren, dass der nicht aus Versehen mal NULL ist.

    Das Argument mit NULL hab ich noch nie verstanden - in irgendeinem Zusammenhang. Ob ich nun selbst festlege, dass in einem bestimmten Kontext ein Zeiger nicht NULL sein soll, oder der Standard das von vornherein tut, ist doch im Endeffekt völlig egal.
    Was ich meine ist aber, dass im Falle nichtstatischer Member eine Referenz keinerlei Vorteil gegenüber einem konstanten Zeiger hat (und ich bin sicher niemand, der Zeiger allgemein Referenzen vorzieht) - und meistens ist ja schon das const bei nichtstatischen Membern fehl am Platz (ich sehe es hier jedenfalls immer wieder, dass Member const definiert werden, obwohl diese Konstanz bloßer Reflex der Konstanz aller Objekte der Klasse ist). Man hat mit zusätzlichen Einschränkungen zu leben (keine Zeiger oder Referenzen auf die Referenz bzw. keine Zeiger auf Member) - das kann z.B. im Zusammenhang mit Standardalgorithmen unschön werden.
    Dann gibt es da ein Namensproblem, falls man zu den Leuten gehört, die die Membereigenschaft im Namen kenntlich machen (m_ _ etc.). Ist es logisch richtig, einer Referenz diesen Namenszusatz zu geben oder nicht?
    Schließlich verändert ja
    this->foo_ = x;
    das Objekt gerade nicht, wenn foo_ eine Referenz ist, die irgendwohin zeigt - womit die Zweckmäßigkeit des Namensschemas in Frage zu stellen wäre.



  • Hallo an alle,

    danke für die Antworten.
    Kurz zur Erläuterung:
    Ich hatte auch schon Pointer auf Arrays verwendet, aber dann kommt im "Runmodus"
    "Segmentation violation"......deshalb wollte ich nur ausprobieren, ob es mit Referencen besser klappt....

    Grüße,
    Gordon



  • grobian schrieb:

    "Segmentation violation"......deshalb wollte ich nur ausprobieren, ob es mit Referencen besser klappt....

    Das sind häufig Speichezugriffsfehler durch Zugirffe über Arraygrenzen hinaus. versuchs mal mit vector, da ist es leichter, sowas zu verhinden.



  • camper schrieb:

    Ist es logisch richtig, einer Referenz diesen Namenszusatz zu geben oder nicht?
    Schließlich verändert ja
    this->foo_ = x;
    das Objekt gerade nicht, wenn foo_ eine Referenz ist, die irgendwohin zeigt - womit die Zweckmäßigkeit des Namensschemas in Frage zu stellen wäre.

    Interessanter Aspekt und guter Einwand. 👍


Anmelden zum Antworten