Äquivalent von Pascals/Delphis with



  • Hallo,

    was ich mich schon seit meinen ersten Gehversuchen in C++ frage, ist,
    warum C++ keine Entsprechung für die aus Pascal bekannte "with" Anweisung hat.
    Und das, wo doch gerade in C/C++ so oft das Ausfüllen von Strukturen benötigt wird.

    Oder hab ich da wirklich etwas übersehen, und diese Möglichkeit existiert doch?
    Also das man quasi schreiben könnte:

    struct VERYLONGSTRUCTURE 
    {
      long lSize;
      int nX,nY;
    } verylongstructurevariablewhichisneitherconstantnorstatic;
    with verylongstructurevariablewhichisneitherconstantnorstatic
       {
         lSize = sizeof(VERYLONGSTRUCTURE);
         nX = 47;
         nY = 11;
       }
    


  • Gibts nicht.



  • Nicht in reinem C++.
    Aber der C++ Builder, wie auch Delphi, hat so eine Funktion.



  • Nimm doch eine Referenz.

    VERYLONGSTRUCTURE& vls = verylongstructurevariablewhichisneitherconstantnorstatic;
    vls.lSize = sizeof(VERYLONGSTRUCTURE);
    vls.nX = 47;
    vls.nY = 11;
    


  • Hi!

    @tag:
    Es geht bei with darum das man damit den Bezeichner weglassen kann, dies kann teilweise ganz nützlich sein, wenn man auf eine große Struktur zugreifen muss um nicht immer "bla." schreiben zu müssen, dann reicht ein einfaches "with bla do begin ... end". Also niochts anderes als eine Vereinfachung der Schreibweise.

    Allerdings kann man mit diesem with auch leicht in die Falle tappen. Ein Konflikt kann bei Namensgleichheit zwischen Variablen und Feldbezeichnern auftreten. Deswegen ist es imho ganz gut das es das in C++ nicht gibt, wo man an einigen Stellen immer noch ein wenig aufpassen muss (z.B. break in case).

    Code-Hacker



  • IMHO taucht das Problem in objektorientiertem C++ nicht so häufig auf, dass sich das lohnen würde. In C sieht das schon anders aus, da gibts ja kein implizites this.



  • Hi!

    @Bashar:
    Dann veränderst du das ja aber auch in der Klasse/Struktur mit this und nicht außerhalb, z.B. sowas:

    struct foo {
      int iFoo;
      double dFoo;
      /* weitere viele Variablen */ 
    };
    
    // irgendwo anders:
    foo x;
    x.iFoo = 1;
    x.dFoo = 2.0;
    /* weitere Änderungen */
    

    In Delhi sähe das so aus:

    with x do begin
      iFoo = 1;
      dFoo = 2.0;
      /* weitere Änderungen */ 
    end;
    

    Du schreibst den Bezeichner einmal und änderst alle Member ohne jedesmal den Variablennamen angeben zu müssen. An sich praktisch, aber auch Fehleranfällig und das muss man ja nicht noch steigern, schon gar nicht in C.

    Code-Hacker



  • Ja, so meinte ich das. Dadurch, dass du die meisten Änderungen in der Klasse selbst machst, brauchst du das with nicht wirklich.



  • Gut, dann bin ich ja erstmal beruhigt, dass ich nicht all die Zeit einen Befehl übersehen habe 😉

    Was die Gefahr der Verwechslung angeht, die angesprochen wurde:
    Es wär doch eigentlich dasselbe in Grün wie bei den Namespaces.
    So dass man die durch Structurelemente verdeckten Variablen durch '::' ansprechen könnte.
    In dem Bereich hätte ich eigentlich auch die Lösung erwartet.
    Wäre doch vielleicht sinnvoll, für Strukturobjekte sozusagen automatisch einen gleichlautenen Namespace zu erstellen.So dass dann 'using' dass gesuchte Gegenstück in C++ wäre.



  • Hi!

    Bashar schrieb:

    Ja, so meinte ich das. Dadurch, dass du die meisten Änderungen in der Klasse selbst machst, brauchst du das with nicht wirklich.

    Achso. Dachte du meinstest auch außerhalb der Klasse, aber dann sind wir uns ja einig. 🙂

    Code-Hacker



  • SeppSchrot schrieb:

    In dem Bereich hätte ich eigentlich auch die Lösung erwartet.

    wird's in c++ kaum geben.
    für diese beispiel gibts keinen bedarf. irgendwo steht bestimmt, warum man normalerweise kontroktoren vor zuweisungen bevorzugen soll. hat irgendwas mit geschwindigkeit und fehlervermeidung zu tun.
    bei ganz simplen structs, die innendrin nur eingebaute typen haben, mag das ja noch mit zweisungen gehen. aber wer hat denn sowas noch, wo selbstz string schon nen konstruktor hat.
    aber wer weiterhin c schreiben mag, dem hilft die gcc zum beispiel mit struct literalen. da kann man auch gleich alles auf einmal zuweisen.


Anmelden zum Antworten