"With" in C++



  • Nabend,
    kann mir jemand sagen, was das C++-Äquivalent zu einem VB-With-Block in C++ ist? "With" und "C++" geben nicht die besten Ergebnisse bei Google. 😉

    Und dann würde mich noch so am Rande interessieren was "FAR" in LONG FAR WINAPI WndProc (HWND , UINT , UINT , LONG); bedeutet.
    MfG
    Dr. Bernd



  • Ist nicht wirklich das Equivalent aber am ehesten noch using.

    Am einfachsten machst du einfach einen lokalen Zeiger auf das was du brauchst.



  • With gibt es nicht und das FAR kommt aus 16 bit Zeiten. Heute kannst du es ruhig weglassen.



  • Danke für eure Antworten, den lokalen Zeiger werd ich wohl mal ausprobieren. 🙂



  • Hi,

    statt eines lokalen Zeigers kann man auch eine Referenz verwenden und durch ein wenig „Tricksen“ recht nahe an VBs 'With' herankommen:

    struct ExampleStruct {
        string Name;
        unsigned int Age;
        enum { FEMALE, MALE, YESPLEASE } Sex;
    };
    
    int main() {
        ExampleStruct SecretAgent;
        // With
        { ExampleStruct& _ = SecretAgent;
            _.Name = "Austin Powers";
            _.Age = 30;
            _.Sex = YESPLEASE;
        }
    }
    

    Ob man sowas wirklich braucht, sei mal dahingestellt: Besser wäre es, einen vernünftigen Konstruktor zu schreiben. In VB6 ist das Konstrukt ja auch eher ein Workaround um die fehlende Möglichkeit, eigene Konstruktoren zu überladen.



  • Hmm, das klingt auch nicht schlecht. Sehe ich das richtig, dass die geschweifte Klammer sozusagen dafür sorgt, dass _ nur darin gültig ist, oder bedeutet das noch mehr?

    Ich finde With vor allem bei Verschachtelungen mit For-Schleifen wesentlich übersichtlicher als z.B. Baum(i).Zweig(j).Blatt(k).Farbe schreiben zu müssen:

    For i = 1 To Wald.AnzahlBäume
        With Wald.Baum(i)
            For j = 1 To .AnzahlZweige
                With .Zweig(j)
                    .Farbe = braun
                    For k = 1 To .AnzahlBlätter
                        With .Blatt(k)
                            .Farbe = grün
                        End With
                    Next k
                End With
            Next j
        End With
    Next i
    


  • Was ist denn da dran übersichtlich?



  • Naja, das ist übersichtlicher als die Terme auszuschreiben, finde ich. Auf jeden Fall ist es weniger Arbeit.



  • Dr. Bernd schrieb:

    Naja, das ist übersichtlicher als die Terme auszuschreiben, finde ich. Auf jeden Fall ist es weniger Arbeit.

    Das bisschen Tipparbeit ist irrelevant, bei „Arbeit“ zählt der Wartungsaufwand. Und solch eine tiefe Verschachtelung ist definitiv schwer zu warten. Letztendlich ist das der Grund, aus dem ich kaum (bis gar nicht) mehr 'With' verwende: Die Verschachtelungsebene steigt, und das ist eigentlich nicht akzeptabel.

    Dein Code benutzt drei vollkommen überflüssige Verschachtelungsebenen, das ist ein Luxus, den man sich normalerweise nicht leisten kann, zumal dazu in fast allen Situationen noch mindestens zwei weitere Ebenen kommen (Klasse + Methode). Das sind dann insgesamt acht (!!!) Verschachtelungsebenen. Üblicherweise wird als absolutes Maximum vier bis fünf empfohlen.



  • Dr. Bernd schrieb:

    For i = 1 To Wald.AnzahlBäume
        With Wald.Baum(i)
            For j = 1 To .AnzahlZweige
                With .Zweig(j)
                    .Farbe = braun
                    For k = 1 To .AnzahlBlätter
                        With .Blatt(k)
                            .Farbe = grün
                        End With
                    Next k
                End With
            Next j
        End With
    Next i
    

    Übersichtlicher ist das für mich auf keinen Fall, denn so muss ich mir erst alle Withs zusammensuchen, um festzustellen, an welcher Farbe ich grad überhaupt rumwurschtel. Dann doch lieber alles in einer Zeile.



  • Okay, das sollte auch nur ein Beispiel sein, war wohl ein besonders schlecht gewähltes. Naja, ich werde in Zukunft mal drauf achten, die Ebenen klein zu halten. Mit with hat es sich ja sowieso ziemlich erledigt. 😉

    Aber es würde mich ja doch noch interessieren, wofür

    { ExampleStruct& _ = SecretAgent;
            _.Name = "Austin Powers";
            _.Age = 30;
            _.Sex = YESPLEASE;
        }
    

    hier die geschweifte Klammer war.



  • Dr. Bernd schrieb:

    Okay, das sollte auch nur ein Beispiel sein, war wohl ein besonders schlecht gewähltes. Naja, ich werde in Zukunft mal drauf achten, die Ebenen klein zu halten. Mit with hat es sich ja sowieso ziemlich erledigt. 😉

    Aber es würde mich ja doch noch interessieren, wofür

    { ExampleStruct& _ = SecretAgent;
            _.Name = "Austin Powers";
            _.Age = 30;
            _.Sex = YESPLEASE;
        }
    

    hier die geschweifte Klammer war.

    Die geschweifte Klammer ist hier dafür da, den Gültigkeitsbereich des Bezeichnets '' zu begrenzen. Nur innerhalb des Blocks ist '' deklariert und gültig.



  • Super, dankeschön. Wieder was gelernt. 🙂


Log in to reply