Konstruktor Problem



  • hallo. ich habe eine Klasse erstellt mit 2 überladenden Konstruktoren:

    class rectangle
    {
    private:
        int itsWidth;
        int itsLenght;
    public:
        rectangle(); //HIER!
        rectangle(int widht,int lenght); //Hier!
        ~rectangle();
        int getWidth();
        int getLenght();
    
    };
    

    Konstrukoren wurden so initalisiert:

    rectangle::rectangle()
    {
        itsWidth=5;
        itsWidth=10;
    }
    rectangle::rectangle(int widht, int lenght)
    {
        itsWidth=widht;
        itsLenght=lenght;
    
    }
    

    Wenn ich dem 2. Konstruktor nun Werte zuweisen möchte, klappt dies nicht:

    rectangle rechteck1, rechteck2;
      rechteck2.rectangle(10,20);
    

    main.cpp:25: error: invalid use of ‘class rectangle’

    Hoffentlich kann mir einer helfen, danke!



  • rectangle rect2(10,20);



  • no no no awful:

    class rectangle
    {
    public:
        rectangle(int widht = 5,int length = 10);
    };
    
    rectangle::rectangle(int widht, int length)
       : width(width),
         length(length) 
    { }
    

    length



  • Von unserem Tutor ist diese Form zugelassen:

    //Konstruktoren überladen
                                                       Merke:
    class rectangle
                                                       In C++ ist eine Methode nicht nur
    {
                                                       durch ihren Namen, sondern auch
       private:
          int itsWidth;                                durch ihre Parameterliste bestimmt.
          int itsLength;
                                                       Methodenname und Parameterliste
       public:
                                                       werden zusammen als „Signatur“
          rectangle();
                                                       bezeichnet. So ist es also möglich
          rectangle(int width, int length);
          ~rectangle() { };                            zwei Methoden gleichen Namens zu
          int GetWidth() const { return itsWitdh; };   deklarieren, wenn sie sich in ihren
          int GetLength() const { return itsLength; };
                                                       Parametern unterscheiden – dabei
    };
                                                       zählen sowohl Anzahl also auch
                                                       Datentypen und Reihenfolge. Dies
    rectangle::rectangle()
    {                                                  bezeichnet man als „überladen“.
       itsWidth = 5;
                                                       Das gleiche, wie im
       itsLength = 10;
                                                       nebenstehenden Beispiel mit dem
    }
                                                       Konstruktor dargestellt, kann
    rectangle::rectangle(int width, int length)        natürlich mit jeder x-beliebigen
    {                                                  Klassenmethode durchgeführt
       itsWidth = width;
                                                       werden.
       itsLength = length;
    }
    

    Habe das Programm aber in 3 Elementen aufgeteil, in: main.cpp, rectangle.h(mit den Klassen), rectangle.cpp (mit Funktionsdefinitionen)

    möchte aber den Konstruktor über die main.cpp ändern und die Form wie oben bei belassen.

    Dieser Befehl klappt leider nicht:
    rechteck2.rectangle(10,20);

    wieso nicht?



  • natürlich nicht weil der standartkonstruktur bereits bei

    rectangle rechteck1, rechteck2;
    

    ausgeführt wurde.
    du musst wenn

    rectangle rechteck1;
    rectangle rechteck2(10,20);
    

    machen



  • Mal abgesehen von deinem Rechtschreibfehler in GetWidth, wo die Variable wohl itsWidth heißen sollte, ist dein Code soweit in Ordnung.

    Der Aufruf von rechteck2.rectangle(10,20); in der Form geht nicht. Der Konstruktor ist ja in dem Sinne keine Funktion, die man jederzeit aufrufen kann.

    Bei der Instanziierung deiner Objekte aber dann in Ordnung:

    rectangle a;
    rectangle b(10,20);
    
    cout << a.GetWidth() << " " << a.GetLength() << endl;
    cout << b.GetWidth() << " " << b.GetLength() << endl;
    


  • danke, dass funktioniert!

    leider, funktioniert das nur wenn ich die Werte eintrage, 
    wenn ich sie aber als variablen übergeben will, wird 0 übergeben, wie kann ich das so lösen, dass ich die werte eingeben kann? 
    int main()
    {
        int breite=0;
        int lange=0;
        rectangle rechteck1;
        rectangle rechteck2(breite,lange);
    
          cout<<endl<<"****** Rechteck2 ********";
        cout<<endl<<"Breite eingeben: ";
        cin>>breite;
        cout<<endl<<"Länge eingeben: ";
        cin>>lange;
        cout<<endl<<"Breite: "<<rechteck2.getWidth();
        cout<<endl<<"Länge: "<<rechteck2.getLength();
    
        return 0;
    }
    


  • indem du die Reihenfolge deiner Codezeilen änderst.

    int main()
    {
        int breite=0;
        int lange=0;
    
        // erst eingeben....
        cout<<endl<<"****** Rechteck2 ********";
        cout<<endl<<"Breite eingeben: ";
        cin>>breite;
        cout<<endl<<"Länge eingeben: ";
        cin>>lange;
    
        // ... dann verwenden
        rectangle rechteck1;
        rectangle rechteck2(breite,lange);
    
        cout<<endl<<"Breite: "<<rechteck2.getWidth();
        cout<<endl<<"Länge: "<<rechteck2.getLength();
    
        return 0;
    }
    

    // Edit: YEAAAHHHH Mexiko-Frankreich 2-0


Log in to reply