Warum muessen Default Parameter in C++ Konstanten sein?



  • Hi,

    wieso sollte das denn nicht gehen?

    #include <iostream>
    using namespace std;
    
    int var2 = 20;
    
    int blah(int var=var2)
    {
        return var;
    };
    
    int main()
    {
        cout << blah(2) << endl;
        cout << blah() << endl;
    }
    


  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich hatte sowas versucht:

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
            int m_func(int=var_);
    
    protected:
            int var_;
    };
    
    int A::m_func(int var)
    {
            return var;
    }
    
    int main()
    {
        A a;
        cout << a.m_func(42) << endl;
        cout << a.m_func() << endl;
    }
    

    Und des klappt eben nicht...



  • Hallo,

    äh, und dich wundert es jetzt, dass das nicht funktioniert? Denk nochmal bitte genau darüber nach..... 🙄



  • Raptor schrieb:

    Ich hatte sowas versucht:

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
            int m_func(int=var_);  // was soll das denn sein?
    
    protected:
            int var_;           //ich verstehe aber nicht, warum du eine klasse benutzt, oder du diese variable brauchst....
    };
    
    int A::m_func(int var = 2)
    {
            return var;
    }
    
    int main()
    {
        A a;
        cout << a.m_func(42) << endl;
        cout << a.m_func() << endl;
    }
    

    Und des klappt eben nicht...



  • @leech:

    public:
    int m_func(int=var_); // was soll das denn sein? das ist ein default parameter.

    @carstenj: Liegt es daran, dass var_ nicht static ist?



  • Raptor schrieb:

    @leech:

    public:
    int m_func(int=var_); // was soll das denn sein? das ist ein default parameter.

    das ist aber ganz bestimmt kein default parameter....

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
            int m_func(int var2);   //die funktion in der klasse
    
    protected:
            int var2;           
    };
    
    //die implementation...
    int A::m_func(int var = 2)          //DAS ist ein default parameter!
    {
            return var;
    }
    
    int main()
    {
        A a;
        cout << a.m_func(42) << endl;          //42
        cout << a.m_func() << endl;             //2
        cin.get();
        return 0;
    }
    

    schon mal an sowas gedacht?



  • Wie erklärst Du Dir das funktionierende Beispiel von CarstenJ?



  • Mein lieber leech click

    leech schrieb:

    Raptor schrieb:

    @leech:

    public:
    int m_func(int=var_); // was soll das denn sein? das ist ein default parameter.

    das ist aber ganz bestimmt kein default parameter....

    Doch, das ist ein Default Parameter. Ueberzeuge dich, wenn du willst
    z.B: http://tutorial.schornboeck.net/default_parameter.htm

    Beides ist richtig.



  • edit



  • CarstenJ schrieb:

    äh, und dich wundert es jetzt, dass das nicht funktioniert? Denk nochmal bitte genau darüber nach..... 🙄

    Zu welchem Schluss kommst DU? Es gibt eigentlich keinen technischen Grund, dass das nicht geht. Es ist reine Willkür, beugt Fehlern vor oder hat sonstigen erzieherischen Zweck.



  • Bashar schrieb:

    CarstenJ schrieb:

    äh, und dich wundert es jetzt, dass das nicht funktioniert? Denk nochmal bitte genau darüber nach..... 🙄

    Zu welchem Schluss kommst DU? Es gibt eigentlich keinen technischen Grund, dass das nicht geht. Es ist reine Willkür, beugt Fehlern vor oder hat sonstigen erzieherischen Zweck.

    Mir ging es dabei auch um den Sinn. Wenn ich erst eine Funktion mit Parameter aufrufen muss, damit ich sie beim nächsten Mal ohne Parameter aufrufen kann, erschließt sich mir der Sinn nicht. Defaultparameter sind doch u. a. dafür da, dass der Aufrufer keinen fehlerhaften Aufruf der Funktion durchführen kann?!

    @carstenj: Liegt es daran, dass var_ nicht static ist?

    Ja, wenn die Variable static const wäre, würde es funktionieren. Also so gesehen wer die Ausgangsfrage falsch gestellt.



  • Defaultparams sind dafür da, wenn ich z.B. nicht weiß was ich genau übergeben soll. Oder wenn ich mir Arbeit ersparen will, weil der Deafultparam irgendwie schon passt. Ist ja bei GUIs ganz super. Sagen wir mal, ich will ein Fenster konstruieren. Warum soll ich mir da unbedingt Werte für die Position und Größe überlegen? Notfalls kann ich aber trotzdem was anderes übergeben.

    Auch spart das redundante Funktionen und Methoden ein. Anstatt das ich 3 gleichnamige Funktionen mit drei verschiedenen Paramteranzahl schreibe, schreib ich nur eine. Viel übersichtlicher:

    void foo(int p1);
    void foo(int p1, int p2);
    void foo(int p1, int p2, int p3);
    

    Kann viel einfacher für den Benutzer sein:

    void foo(int p1=0 , int p2=0, int p3=0);
    


  • @Artchi: netter Beitrag. Was hat er mit dem Thema zu tun?



  • CarstenJ schrieb:

    Mir ging es dabei auch um den Sinn. Wenn ich erst eine Funktion mit Parameter aufrufen muss, damit ich sie beim nächsten Mal ohne Parameter aufrufen kann, erschließt sich mir der Sinn nicht. Defaultparameter sind doch u. a. dafür da, dass der Aufrufer keinen fehlerhaften Aufruf der Funktion durchführen kann?!

    Hmm? Kannst du das noch mal kurz erläutern?



  • Raptor schrieb:

    Mein lieber leech click

    leech schrieb:

    Raptor schrieb:

    @leech:

    public:
    int m_func(int=var_); // was soll das denn sein? das ist ein default parameter.

    das ist aber ganz bestimmt kein default parameter....

    Doch, das ist ein Default Parameter. Ueberzeuge dich, wenn du willst
    z.B: http://tutorial.schornboeck.net/default_parameter.htm

    Beides ist richtig.

    okay sorry.. kannte diese schreibweise ( int = var ) nicht... von daher bin ich von einem anderen problem ausgegangen ( ich dachte, dass es an dieser schreibweise lag... )

    wieder gut?



  • Jester schrieb:

    @Artchi: netter Beitrag. Was hat er mit dem Thema zu tun?

    Deshalb:

    CarstenJ schrieb:

    Mir ging es dabei auch um den Sinn. Wenn ich erst eine Funktion mit Parameter aufrufen muss, damit ich sie beim nächsten Mal ohne Parameter aufrufen kann, erschließt sich mir der Sinn nicht. Defaultparameter sind doch u. a. dafür da, dass der Aufrufer keinen fehlerhaften Aufruf der Funktion durchführen kann?!



  • Hi,

    finix schrieb:

    Hmm? Kannst du das noch mal kurz erläutern?

    so wie ich das verstanden habe, möchte Raptor erst eine Variable initialisieren, damit er sie später als "Defaultparameter" nutzen kann. In seinem Fall macht er das, indem er die Funktion einmal mit Parameter aufruft.

    Aber der Defaultparameter soll ja durch den Programmierer der Funktion festgelegt werden, der am besten weiss, ob es überhaupt Sinn macht einen zu definieren oder nicht. Wenn jeder Aufrufer der Funktion den "Defaultparameter" ändern kann, ergibt das doch überhaupt keinen Sinn.



  • @Carsten: Gesetzt den Fall, die Variable wird durch eine andere Funktion bestimmt, könnte ich mir vorstellen, dass dieses Verfahren einen Vorteil bringen könnte... Entweder bestimmtes verhalten oder das Verhalten das das Objekt vorsieht...

    Hab grad selber damit rumgespielt... Es scheint, Klassenmember dürfen keine Defaultvariablen sein?

    -junix



  • Hmmm interessant... mit Statischen Membern funktionierts... Nicht aber, wenn ich this-> oder sowas davor setze... (ist ja auch irgendwie verständlich)


Anmelden zum Antworten