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 wennrectangle 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