Standardparameter lässt keine Alternativen zu



  • Hallo...

    Der Konstruktor meiner Klasse CWheel hat 5 Parameter, die alle einen Standardparameter benutzen:

    CWheel::CWheel( CVector nPosition = CVector( 0, 0 ), CVector nVelocity = CVector( 0, 0 ), float nRadius = 1, float nLR = 0, CVector nGravity = CVector( 0, 0 ) ): Position( nPosition ), Velocity( nVelocity ), Radius( nRadius ), LR( nLR ), Gravity( nGravity ) {}
    

    Allerdings kommt es zu folgendem Problem:

    Wheel[0] = new CWheel( CVector( -6.0f,  1.0f ), CVector( 10.0f,  0.0f ), 0.5f, 0.8f, CVector( 0, 9.81f ) );
    

    Wenn ich derart initialisiere, werden die ersten 3 Parameter zufriedenstellend verarbeitet, sodass diese Werte auch in entsprechender Instanz gespeichert werden. Der vierte ( LR - 0.8f ) und fünfte ( Gravity - CVector( 0, 9.81f ) ) Parameter werden aber scheinbar gar nicht ausgewertet, da diese nach obenstehender Initialisierung dem Standardparameter entsprechen. (Nachträglich kann ich die Attribute der Klasse problemlos ändern, nur eben mit diesem Konstruktor nicht, das is mir aber schon ziemlich wichtig...)

    Jetzt frage ich euch, was mache ich falsch? Hab ich da was übersehen???

    mfG D1B



  • versuch mal die defaultparameter in die deklaration (oben in der kalssendefinition) der funktion und nicht in die definition zu schreiben !



  • mach einen minimalen compilierbaren code, der das fehlerverhalten zeigt. meist loest man dabei das problem.



  • krass, das CWheel:: hab ich uebersehen. welcher compiler laesst denn das zu?



  • Hi, danke erstmal,

    hier hab ich jetzt was zurechtkopiert, damit ihr dass ausführen könnt:

    #include <stdio.h>
    
    class CVector
    {
    public:
        float x,
              y;
    
        CVector( float nx = 0, float ny = 0 ) : x( nx ), y( ny ) {}
    
        const CVector& operator =(const CVector *Vector) {
            x = Vector->x;
            y = Vector->y;
            return *this;
        }
    };
    
    class CWheel
    {
    public:
        CVector Position,
                Velocity,
                Gravity;
        float   Radius,
                LR;
    
        CWheel( CVector nPosition = CVector( 0, 0 ), CVector nVelocity = CVector( 0, 0 ), float nRadius = 0, float nLR = 0, CVector nGravity = CVector( 0, 0 ) ): Position( nPosition ), Velocity( nVelocity ), Radius( nRadius ), LR( nLR ), Gravity( nGravity ) {}
        CWheel operator =( CWheel *Wheel )
        {
            Position = Wheel->Position;
            Velocity = Wheel->Velocity;
            Radius   = Wheel->Radius;
            return *this;
        }
        void ShowValues() {
            printf( "Position.x = %f\n", Position.x );
            printf( "Position.y = %f\n", Position.y );
            printf( "Velocity.x = %f\n", Velocity.x );
            printf( "Velocity.y = %f\n", Velocity.y );
            printf( "Radius     = %f\n", Radius );
            printf( "LR         = %f\n", LR );
            printf( "Gravity.x  = %f\n", Gravity.x );
            printf( "Gravity.y  = %f\n", Gravity.y );
        }
    
    } Wheel;
    
    int main()
    {
        Wheel = new CWheel( CVector( 7,  7 ), CVector( 7,  7 ), 7, 7, CVector( 7, 7 ) );
        Wheel.ShowValues();
    
        return 1;
    }
    

    Ausgabe:

    Position.x = 7.000000
    Position.y = 7.000000
    Velocity.x = 7.000000
    Velocity.y = 7.000000
    Radius     = 7.000000
    LR         = 2.000000
    Gravity.x  = 2.000000
    Gravity.y  = 2.000000
    Press any key to continue
    

    Wäre euch echt sehr verbunden, wenn ihr mir da helfen könntet...
    (alle Parameter werden mit 7 initialisiert, aber bei den letzten drei Werte werden mit dem Standardparameter belegt, macht dass es Siebenen sind...)

    mfG D1B



  • *lol*

    dein op= ist n bisschen komisch...

    mach da mal die zeiger raus und schreib den code dann ordentlich... momentan ists nur ein schoenes anschauungs material wie operatoren ueberladung auch missbraucht werden kann.



  • btw:
    dein fehler scheint liegt im op=

    von den stilistischen mal abgesehen.



  • Die op=s können eh weg, weil die automatisch generierten schon das richtige tun. Warum Gravity und "LR" nicht mitkopiert werden sollen, weiß ich nicht, aber es ist bestimmt nicht intuitiv für den Benutzer von op=. Ansonsten ist der Code eh seltsam und leakt.



  • Ich hab leider nie ein Beispiel gesehen, wie ich den Operator = überladen soll, hab mir das nur so ma fix zusammengebastelt und bin auch immer gut damit gefahren...

    CVector operator =(CVector Vector) {
            x = Vector.x;
            y = Vector.y;
            return *this;
        }
    
        CWheel operator =( CWheel Wheel )
        {
            Position = Wheel.Position;
            Velocity = Wheel.Velocity;
            Radius   = Wheel.Radius;
            return *this;
        }
    
        Wheel = CWheel( CVector( 7,  7 ), CVector( 7,  7 ), 7, 7, CVector( 7, 7 ) );
    

    So besser? Vielleicht könnt ihr mir mal schreiben, wie ihr das lösen würdet... Soweit danke auf jeden!

    mfG D1B



  • aber doch nicht by value...



  • CWheel operator =( CWheel Wheel )
        {
            Position = Wheel.Position;
            Velocity = Wheel.Velocity;
            Radius   = Wheel.Radius;
            return *this;
        }
    

    Wenn ich diesen Operator rauslasse klappts tatsächlich, ich danke euch also!!! Ich frage mich aber weiterhin, woran lag es??? Und zusätzlich wäre ich dankbar, wenn ihr mal zeigen könntet, wie ihr den Code schreiben würdet, ich will schließlich noch dazulernen... 🙂

    Danke nochma,
    mfG D1B

    Edit:
    Auch mit diesem Operator per Referenz schlägt die Initialisierung fehl: 😞

    CWheel& operator =( CWheel Wheel )...
    


  • bitte beschaeftige dich mit den grundlagen.
    einfach so zusammenbasteln ist nicht gut - frag nach wie es richtig gehoert.

    siehe zB: http://www.schornboeck.net/ckurs/operatoren.htm

    lies auch mal volkards tutorial!


Anmelden zum Antworten