Arrays von Klassen implementieren?
-
Hi,
Ich habe 2 Klassen mit den Namen Kunden und Konten und würde für beide gerne einen array mit einer Größe von 100 implementieren. Wir haben gelernt dass das einfach so geht:
Kunden kundenspeicher [100]; Konten kontenspeicher [100];Der Compiler spuckt mir allerdings folgendes aus: C:\Users\windows\Desktop\Studium\Programmieren\test\Unbenannt1.cpp [Error] no matching function for call to 'Kunden::Kunden()'
Sowie einige Candidates.Meine Klassen sehen wiefolgt aus:
class Kunden{ int kundennummer, telephonnummer; string adresse, geburtsdatum; public: Kunden(int Kundennummer,int telephonnummer,string adresse, string geburtsdatum); }; Kunden::Kunden(int kundennummer,int telephonummer,string adresse, string geburtsdatum){ this -> kundennummer = kundennummer; this -> telephonnummer = telephonnummer; this -> adresse = adresse; this -> geburtsdatum = geburtsdatum; } class Konten{ int kontonummer; bool kontoart; double kontostand; public: Konten(int kontonummer, bool kontoart, double kontostand); void ueberweisung(Konten &x, int betrag); void einzahlung(int betrag); void auszahlung(int betrag); };Kann mir jemand sagen was diese Fehlermeldung bedeutet und wie ich das ganze richtig mache? Danke im Voraus!

Cheers,
Flügelnuss
-
Sieht aus als fehle der Defaultkonstruktor, der ist weg sobald du einen spezialisierten Konstruktor schreibst, brauchst du dann trotzdem einen, musst du den selbst schreiben.
-
CppAnfaenger2014 schrieb:
Sieht aus als fehle der Defaultkonstruktor...
Richtig.
Mit dem Erzeugen der beiden Arrays wird versucht jeweils 100 Objekte zu erzeugen. Dabei wird der Standardkonstruktor verwendet, aber der bei beiden Klassen nicht mehr (Wenn ein Konstruktor für eine Klasse geschrieben wird, wird der Standardkonstruktor entfernt).
Nun gibt es 2 Möglichkeiten:
class Kunden { // ... // Eigener Konstruktor => Der Standardkonstruktor wird nicht mehr // vom Compiler generiert. Kunden(int kundennummer, int telefonnummer, string adresse, string geburtsdatum); }; // Mögliche Lösungen: // a) Schreibe einen _zusätzlichen_ Standardkonstruktor class Kunden { // ... Kunden(); Kunden(int kundennummer, int telefonnummer, string adresse, string geburtsdatum); }; // b) Mache die Parameter deiner Konstruktoren optional, und belege diese mit // einem sinnvollen Standardwert class Kunden { // ... Kunden(int kundennummer = 0, int telefonnummer = 0, string adresse = "", string geburtsdatum = ""); };
-
flügelnuss schrieb:
// ... double kontostand; // ...Yay! again

~captcha: Nussknacker~
-
Achja stimmt, den hatte ich komplett vergessen. Der Compiler gibt mir jetzt zwar keine Fehlermeldung mehr allerdings kommt wenn ich das Programm starte sofort eine Meldung dass es nicht mehr funktioniert und die Konsole schreibt das hier:
terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid
This application has requested the Runtime to terminate it in an unusual way. Please contact the applications's support team for more information.
Was bedeutet das schon wieder?

-
flügelnuss schrieb:
Achja stimmt, den hatte ich komplett vergessen. Der Compiler gibt mir jetzt zwar keine Fehlermeldung mehr allerdings kommt wenn ich das Programm starte sofort eine Meldung dass es nicht mehr funktioniert und die Konsole schreibt das hier:
terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid
This application has requested the Runtime to terminate it in an unusual way. Please contact the applications's support team for more information.
Was bedeutet das schon wieder?

Interpretiere ich so, dass ein string-Konstruktor irgendwo mit einem Nullzeiger (nicht erlaubt) statt eines Zeigers auf einen leeren C-String aufgerufen wird.
-
Swordfish schrieb:
flügelnuss schrieb:
// ... double kontostand; // ...Yay! again

Wenn du schon hier einen Kommentar schreibst, dann wenigstens mit einer Erklärung warum (double ist ungeeignet weil...). Und wenn schon könnte man auch die Typen von Geburtsdatum und Kontoart anmerken, die sicherlich auch nicht optimal sind.
Ich gehe hierbei von einer der ersten Übungen aus, bei dem es keinen wirklichen Unterschied macht ob 3,30€ nun 3,30€ oder vielleicht 3,2999902834€ (oder was auch immer) sind. Wobei mich verwundert das der Kontostand double, die Beträge grundsätzlich aber int sind.
@flügelnuss: Gleitkommazahlen wie float und double sind immer nur Nährungswerte mit Ungenauigkeiten - Für Geld ist es sinnvoller eher Integerwerte zu nehmen (und diese dann z.B. als Centbeträge zu interpretieren).
-
asc schrieb:
Wenn du schon hier [...]
Ich wollte damit nur anmerken, daß sich das in den letzten tagen auffällig häuft. Und ja ... ich darf das, Spaßbefreiter asc.