Warum muessen Default Parameter in C++ Konstanten sein?



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



  • junix schrieb:

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

    Da bekannterweise der Caller die Argumente pusht, muss der Caller zugriff auf den default wert haben, sonst würde dieser mechanismus nicht mehr klappen...

    Und this ist im Funktionskopf nicht erlaubt.



  • Soviel ist mir klar, mein lieber Shade... Allerdings - nein, ich habe nicht in den Standard gesehen - dürfte bei einem "void-like" aufruf diese Problematik umfallen.

    [edit]Ausserdem ist der Zugriff bei einem protected-static-Member ja auch nicht gegeben?[/edit]

    Naja, hab jetzt grad noch ne Idee gehabt, die Problematik zu umgehen. Schliesslich bietet cpp ja die Möglichkeit, Funktionen zu überladen (o; :

    class A 
    { 
    public: 
            A(void);
            int m_func(int var); 
            int m_func(void); 
    
    protected: 
            int m_funct_default_int; 
    
    }; 
    
    A::A(void)
    {
        m_funct_default_int = 12;
    }
    
    int A::m_func(void)
    {
        return m_func(m_funct_default_int);
    }
    
    int A::m_func(int var) 
    { 
            return var; 
    } 
    
    int main(int argc, char *argv[])
    {
        A a; 
        cout << a.m_func(42) << endl; 
        cout << a.m_func() << endl; 
    
      return 0;
    }
    


  • Shade Of Mine schrieb:

    Da bekannterweise der Caller die Argumente pusht

    Das ist Low-Level-Sicht. Konzeptionell ist ein Default-Argument nicht von einer Überladung mit weniger Argumenten zu unterscheiden, d.h.

    void foo(int a, int b = c);
    

    sollte das gleiche sein wie

    void foo(a, b);
    void foo(a) { foo(a, c); }
    

    Von daher spielt es IMHO keine Rolle, ob der Aufrufer den Default-Argument-Ausdruck auch selbst auswerten könnte.



  • CarstenJ schrieb:

    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.

    Nein, da musst du dich vertan haben.
    Schau dir noch mal den Sourcecode an(hab die variablen zu klarheit umbenannt):

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

    Die Variable var wird nicht durch die Funktion initialisiert. Sie ist einfach nur member der Klasse A. Ebenfalls member ist die Funktion m_func. Sie nimmt als Default-Parameter eben diese Variable var und macht irgendwas damit - voellig egal, was.(in dem Falle returned)
    Und mein Problem ist, dass genau das nicht klappt....

    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.

    Kann er nicht.

    @leech: Wieder gut 🙂



  • Raptor schrieb:

    Sie ist einfach nur member der Klasse A. Ebenfalls member ist die Funktion m_func.

    Ok....

    Sie nimmt als Default-Parameter eben diese Variable var und macht irgendwas damit - voellig egal, was.(in dem Falle returned)
    Und mein Problem ist, dass genau das nicht klappt....

    Welchen Wert hat denn die Variable var, wenn sie vorher nicht initialisiert wurde?
    Dein Problem ist, dass du innerhalb einer Klasse keiner nicht statischen Variablen einen Wert zuweisen kannst.

    Außer so ("Enum Hack"):

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


  • CarstenJ schrieb:

    Welchen Wert hat denn die Variable var, wenn sie vorher nicht initialisiert wurde?

    Das Problem würde ja nur bei Defaultparametern für Konstruktoren auftreten. (Sollte zumindest so sein 😉 )

    CarstenJ schrieb:

    Dein Problem ist, dass du innerhalb einer Klasse keiner nicht statischen Variablen einen Wert zuweisen kannst.

    Würde sich ja rein logisch immer auf "this" beziehen, siehe Überladungen junix/Bashar. Oder?



  • finix schrieb:

    CarstenJ schrieb:

    Welchen Wert hat denn die Variable var, wenn sie vorher nicht initialisiert wurde?

    Das Problem würde ja nur bei Defaultparametern für Konstruktoren auftreten. (Sollte zumindest so sein 😉 )

    Genau, das meine ich naemlich auch.

    CarstenJ schrieb:

    Dein Problem ist, dass du innerhalb einer Klasse keiner nicht statischen Variablen einen Wert zuweisen kannst.

    Wenn ich aber meine Funktion aufrufe, dann sollte diese Variable aber schon lange einen Wert haben.
    .



  • Kann sich da vielleicht noch jemand zu aeussern?



  • Meine Beiträge hat hier wohl noch keiner gelesen oder?



  • junix schrieb:

    Es scheint, Klassenmember dürfen keine Defaultvariablen sein?

    Naja, ich wollte halt noch mal ne konkrete Antwort darauf haben.
    Dass es mit statischen members funktioniert, habe ich mir schon gedacht. Aber ich will halt einen non-static default-parameter.
    So wie ich das jetzt verstanden habe ist das so, wie ich mir das vorstelle nicht moeglich.... 😞


Anmelden zum Antworten