Zwei Syntax Fragen



  • Moin, ich hab da mal zwei Fragen zum C++ Syntax: (Die Methoden stammen nicht von mir)

    int SimpleGUI::InitGUI(const char* /*name*/, const std::vector<std::string>& /*options*/)
    {
        return 0;
    }
    

    Warum kommentiert man die Übergabeparameter aus?
    Damit man sie nicht verwendet kann, weil man es nicht will? (Dummer Grund)
    Und warum lässt der C++ Syntax solche Gebilde überhaupt zu?

    bool SimpleGUI::isShiftPressed() const {
    				return m_isShiftPressed;
    				//return glutGetModifiers()&GLUT_ACTIVE_SHIFT;
    			}
    

    Wofür sorgt das const hinter dem Methodennamen?



  • Das erste ist Schrott, was Stil angeht, geht aber prinzipiell, da der Compiler nur den Typ braucht und nicht den Namen (s. Platzhalter-int bei pre/postfix ++/-- Operatorüberladung).
    Das const bedeutet, dass diese Funktion auch für konstante Objekte aufgerufen werden kann.


  • Mod

    Beim ersten sollen wohl Compilerwarnungen bezüglich unbenutzter Variablen unterdrückt werden.



  • Nathan schrieb:

    Das erste ist Schrott, was Stil angeht,

    Wie würdest du es machen?



  • Nicht auskommentieren, die Variablen benutzen und gut ist.
    Dafür hat man doch Funktionsparameter...
    Aber nein, ich übergebe einfach nur so zum Spaß an jede Funktion einen riesigen Vektor voller Bilder als Kopie und verwende ihn nicht, nur so zum Spaß. 😉



  • Nathan schrieb:

    Nicht auskommentieren, die Variablen benutzen und gut ist.

    Ahja, so auf die Art

    unused = unused
    

    oder wie?

    Manchmal braucht die Basis ein Argument einfach nicht, aber Ableitungen vielleicht schon.



  • icewater schrieb:

    Und warum lässt der C++ Syntax solche Gebilde überhaupt zu?

    den technischen Hintergrund findet man in ISO/IEC 14882 8.1 Type names 1
    es handelt sich um eine type-id mit opt. abstract-declarator, das ist ein declarator, in dem der zu deklarierende Name weggelassen wird

    To specify type conversions explicitly, and as an argument of sizeof, alignof, new, or typeid, the name of a type shall be specified. This can be done with a type-id, which is syntactically a declaration for a variable or function of that type that omits the name of the entity.



  • Bisher hatte ich noch nie einen Fall, wo das nötig geworden ist. @Obvious



  • Ok, danke für die ganzen schnell Antworten 🙂



  • int * p = new int;
    


  • 😕
    Ja, manuelle Speicherverwaltung, sehr schön, sehr fehleranfällig. Was willst du uns damit sagen?



  • das "int" hinter dem "new" ist ein einfaches Beispiel für eine type-id, also ein declarator ohne zu deklarierenden Namen
    manchmal verwendet man solche Dinge, ohne viel darüber nachzudenken



  • Nathan schrieb:

    Bisher hatte ich noch nie einen Fall, wo das nötig geworden ist. @Obvious

    Und daraus folgt, dass es niemals nötig ist?



  • Nein, daraus folgt, dass ich an solche Anwendungsfälle nicht gedacht habe, als ich meinen Post schrieb.
    Und rein theoritisch ist das niemals nötig, weil genau so gut, die Argumente in der Klasse gespeichert werden können über eine andere Funktion und in der entsprechenden Funktion dann auf die gespeicherten Argumente zugegriffen wird. 😉



  • Anderes Beispiel: Du hast Funktionszeiger in einem Container, die nunmal eine bestimme Signatur haben (input/output). Nicht jede Funktion verwendet aber den input.
    Ganz allgemein braucht man sowas, wenn man zwar im allgemeinen den Parameter braucht, in Spezialfällen aber eben nicht.
    Und ja, das ist dafür da um Warnings zu unterdrücken und meiner nach besser als die "Alternativen" wie unused = unused;



  • Ja, da hsst du Recht.
    In solchen Fällen kann man aber auch einfach schreiben:

    void foo(T, U)
    {
        //...
    }
    

    Das ist meiner Meinung nach schöner als diese "hässlichen" C-Style-Kommentare.



  • icewater schrieb:

    Moin, ich hab da mal zwei Fragen zum C++ Syntax: (Die Methoden stammen nicht von mir)

    int SimpleGUI::InitGUI(const char* /*name*/, const std::vector<std::string>& /*options*/)
    {
        return 0;
    }
    

    Warum kommentiert man die Übergabeparameter aus?

    Damit der Compiler keine Warnug raustut, daß die Parameter nicht benutzt worden wären.
    An sich eine gute Idee.
    Es gibt natürlich auch andere Wege, das zu bewerkstelligen.

    int SimpleGUI::InitGUI(const char* name, const std::vector<std::string>& options)
    {
        (void)name;//only to make the compiler happy
        (void)options;//only to make the compiler happy
        return 0;
    }
    
    int SimpleGUI::InitGUI(const char* name, const std::vector<std::string>& options)
    {
        boost::do_absolutely_nothing_with(name,options);
        return 0;
    }
    


  • volkard schrieb:

    int SimpleGUI::InitGUI(const char* name, const std::vector<std::string>& options)
    {
        boost::do_absolutely_nothing_with(name,options);
        return 0;
    }
    

    Da hatte aber jemand eine Menge Spaß 😃



  • Nathan schrieb:

    Ja, da hsst du Recht.
    In solchen Fällen kann man aber auch einfach schreiben:

    void foo(T, U)
    {
        //...
    }
    

    Das ist meiner Meinung nach schöner als diese "hässlichen" C-Style-Kommentare.

    Der Meinung bin ich prinzipiell auch.

    void foo(T first, U second); //damit der nutzer sieht was die Parameter prinzipiell bedeuten
    
    void foo(T, U) //wenn ich sie nicht verwende
    {
    }
    

Anmelden zum Antworten