fehlerhafter Konstruktur einer Klasse
-
Hallo Progger,
ich kriege kriege folgende Fehlermeldung während dem Kompilieren:
main.cpp:17: error: `anzahl' was not declared in this scope main.cpp:20: error: `anzahl' was not declared in this scope main.cpp: In constructor `Boot::Boot(int, double)': main.cpp:23: error: no matching function for call to `strlen(std::string[20])' C:/Dev-Cpp/include/string.h:49: note: candidates are: size_t strlen(const char*) main.cpp:27: error: a function-definition is not allowed here before '{' token main.cpp:27: error: expected `,' or `;' before '{' token main.cpp: In function `int main(int, char**)': main.cpp:38: error: expected primary-expression before "void" main.cpp:38: error: expected `;' before "void" main.cpp:77: error: `menue' undeclared (first use this function) main.cpp:77: error: (Each undeclared identifier is reported only once for each function it appears in.) main.cpp:78: error: no matching function for call to `Boot::Boot(int&, std::string[20], int)' main.cpp:12: note: candidates are: Boot::Boot(const Boot&) main.cpp:21: note: Boot::Boot(int, double) main.cpp:79: error: no matching function for call to `Boot::Boot(int&, std::string[20], int)' main.cpp:12: note: candidates are: Boot::Boot(const Boot&) main.cpp:21: note: Boot::Boot(int, double) main.cpp:80: error: no matching function for call to `Boot::Boot(int&, std::string[20], int)' main.cpp:12: note: candidates are: Boot::Boot(const Boot&) main.cpp:21: note: Boot::Boot(int, double)leider weiss ich nicht was an meiner Konstruktordeklaration falsch sein soll. falls es an der fehlenden Konstrukturmethode liegt, habe ich auch eine 2. Variante geschrieben, bei der jedoch eine ähnliche Fehlermeldung kommt.
variante_1
#include <cstdlib> #include <iostream> #include <string> #include <vector> using namespace std; std::string namen[20]; // initialisieren eines Array aller Namen der Vereinsmitglieder std::string warteliste[10]; // initialisieren eines Array der überschüssigen gebuchten Namen std::string namensliste[20]; // initialisieren eines Array aller gebuchten Namen class Boot //Deklaration der Klasse Boot { public: int anzahlBesatzung; // Anzahl der Besatzung std::string besatzungsliste[]; //initialisieren eines Array der Namen von Besatzung double Kosten; //Kosten für Bootcharter Boot(int anzahl, std::string namensliste[anzahl], double kostenBoot); //Oberklassenkonstrukter der Klasse Boot mit 3 Übergabewerten }; Boot::Boot(int anzahl, std::string namensliste[anzahl],double kostenBoot) //Konstruktor-Methode { anzahlBesatzung=anzahl+1; // for(int i=0; i<=strlen(namensliste); i++) (besatzungsliste[i]=namensliste[i]); Kosten=kostenBoot; int ausgabe(double bootKosten, int anzahl) // Ausgabefunktion mit Rückgabewert { cout<<"Kosten pro Person: (bootkosten/anzahl)"; return int(bootkosten/anzahl); } } int main(int argc, char *argv[]) { int anzahlAnmeldungen=0; // Zähler der Anmeldungen void menue(void) // Menue-Funktion für diverse Wünsche { int *zeiger=0; // Pointer um die Arrays bearbeiten char tasteneingabe='0'; // Variable für die Tasteneingabe std::string tmp; // String-Variable zur Ablage des Namen um ein String-Array zu durchsuchen do{ // Ausgabe des Menues cout<<" 1 Anzeige der bisher angemeldeten Personen. "<<endl; cout<<" 2 Anmeldung zur Segelwoche. "<<endl; cout<<" 3 Abmeldung. "<<endl; cout<<" 4 Programmende. "<<endl; cout<<" Bitte waehlen sie einem Menuepunkt ueber die Tastaturziffer 1 bis 4 ! "<<endl; cin>>tasteneingabe; // Eingabe über Tastatur if(tasteneingabe=='1') { for(int i=0; i<=strlen(namensliste); i++) { cout<<namensliste[i]<<endl; } } else if(tasteneingabe=='2') { anzahlAnmeldung++; cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste hinzuzufügen. \n"; scanf("%s", &tmp); strcpy(std::string namensliste[anzahlAnmeldungen], tmp); } else if(tasteneingabe=='3') { cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden. \n"; scanf ("%s", &tmp); //if(tmp==(*zeiger)namenliste[i]) //{ // (*zeiger)namensliste[i]=NULL; // anzahlAnmeldungen--; //} } else if(tasteneingabe=='4') break; }while(tasteneingabe !='0'); } menue(); if (anzahlAnmeldungen>=4 && anzahlAnmeldungen<6) Boot Boot_4(anzahlAnmeldungen, namensliste, 1000); // Definition und Initialisierung der Unterklasse Boot_4 else if (anzahlAnmeldungen>=6 && anzahlAnmeldungen<8) Boot Boot_6(anzahlAnmeldungen, namensliste, 1300); // Definition und Initialisierung der Unterklasse Boot_6 else if (anzahlAnmeldungen>=7 && anzahlAnmeldungen<8) Boot Boot_8(anzahlAnmeldungen, namensliste, 1500); // Definition und Initialisierung der Unterklasse Boot_8 system("PAUSE"); return EXIT_SUCCESS; }Variante_2
#include <vector> #include <string> #include <iostream> using namespace std; std::string namen[20]; // initialisieren eines Array aller Namen der Vereinsmitglieder std::string warteliste[10]; // initialisieren eines Array der überschüssigen gebuchten Namen std::string namensliste[20]; // initialisieren eines Array aller gebuchten Namen class Boot //Deklaration der Klasse Boot { public: int anzahlBesatzung; // Anzahl der Besatzung std::string besatzungsliste[]; //initialisieren eines Array der Namen von Besatzung double Kosten; //Kosten für Bootcharter Boot(int anzahl,string namensliste[anzahl],double kostenBoot); //Oberklassenkonstrukter der Klasse Boot mit 3 Übergabewerten { anzahlBesatzung=anzahl+1; // for(int i=0; i<=strlen(namensliste); i++) (besatzungsliste[i]=namensliste[i]); Kosten=kostenBoot; int ausgabe(double bootKosten, int anzahl) // Ausgabefunktion mit Rückgabewert { cout<<"Kosten pro Person: (bootkosten/anzahl)"; return int(bootkosten/anzahl); } }; int main(int argc, char *argv[]) { int anzahlAnmeldungen=0; // Zähler der Anmeldungen void menue(void) // Menue-Funktion für diverse Wünsche { int *zeiger=0; // Pointer um die Arrays bearbeiten char tasteneingabe='0'; // Variable für die Tasteneingabe std::string tmp; // String-Variable zur Ablage des Namen um ein String-Array zu durchsuchen do{ // Ausgabe des Menues cout<<" 1 Anzeige der bisher angemeldeten Personen. \n"; cout<<" 2 Anmeldung zur Segelwoche. \n"; cout<<" 3 Abmeldung. \n"; cout<<" 4 Programmende. \n"; cout<<" Bitte waehlen sie einem Menuepunkt ueber die Tastaturziffer 1 bis 4 ! \n"; cin>>tasteneingabe; // Eingabe über Tastatur if(tasteneingabe=='1') { for(int i=0; i<=strlen(namensliste); i++) { cout<<namensliste[i]<<endl; } } else if(tasteneingabe=='2') { anzahlAnmeldung++; cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste hinzuzufügen. \n"; scanf("%s", &tmp); strcpy(std::string namensliste[anzahlAnmeldungen], tmp); } else if(tasteneingabe=='3') { cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden. \n"; scanf ("%s", &tmp); //if(tmp==(*zeiger)namenliste[i]) //{ // (*zeiger)namensliste[i]=NULL; // anzahlAnmeldungen--; //} } else if(tasteneingabe=='4') break; }while(tasteneingabe !='0'); } menue(); if (anzahlAnmeldungen>=4 && anzahlAnmeldungen<6) Boot Boot_4(anzahlAnmeldungen, namensliste, 1000); // Definition und Initialisierung der Unterklasse Boot_4 else if (anzahlAnmeldungen>=6 && anzahlAnmeldungen<8) Boot Boot_6(anzahlAnmeldungen, namensliste, 1300); // Definition und Initialisierung der Unterklasse Boot_6 else if (anzahlAnmeldungen>=7 && anzahlAnmeldungen<8) Boot Boot_8(anzahlAnmeldungen, namensliste, 1500); // Definition und Initialisierung der Unterklasse Boot_8 system("PAUSE"); return EXIT_SUCCESS; }
-
Dein Lernmaterial scheint nicht brauchbar zu sein.
- strlen, strcpy und Co. gehören zu C-Strings. std::string bietet dafür Memberfunktionen. Eingelesen wird mit cin.
- Funktionen werden nicht in anderen Funktionen definiert
- Wenn du Arrays mit variabler Länge benötigst, benutze std::vector. Wenn du auf Arrays bestehst, muss es
Boot( int anzahl, std::string namensListe[]lauten.
Nach weiteren Fehlern habe ich nicht gesucht.
-
Hallo @ all
ich habe jetzt die C-Strings und scanf() rausgeworfen
Jetzt funzt es auch halbwegs. Nur die Frage nach der Variante_1 und Variante_2 bleibt unklar. Wann brauche ich den diese Konstruktor-Methode? eventuell nur, wenn ich die den Konstruktor berladen möchte?
Variante_1
#include <cstdlib> #include <iostream> #include <string.h> #include <vector> using namespace std; std::string namen[20]; // initialisieren eines Array aller Namen der Vereinsmitglieder std::string warteliste[10]; // initialisieren eines Array der überschüssigen gebuchten Namen static std::string namensliste[20]; // initialisieren eines Array aller gebuchten Namen int anzahlAnmeldungen=0; // Zähler der Anmeldungen class Boot //Deklaration der Klasse Boot { public: int anzahlBesatzung; // Anzahl der Besatzung std::string besatzungsliste[]; //initialisieren eines Array der Namen von Besatzung double Kosten; //Kosten für Bootcharter Boot(int anzahl, std::string namensliste[], double kostenBoot) //Oberklassenkonstrukter der Klasse Boot mit 3 Übergabewerten { anzahlBesatzung=anzahl+1; // for(int i=0; i<=20; i++) (besatzungsliste[i]=namensliste[i]); Kosten=kostenBoot; } int ausgabe(double bootKosten, int anzahl) // Ausgabefunktion mit Rückgabewert { cout<<"Kosten pro Person: (bootkosten/anzahl)"; return int(bootKosten/anzahl); } }; void menue(void) // Menue-Funktion für diverse Wünsche { int *zeiger=0; // Pointer um die Arrays bearbeiten char tasteneingabe='0'; // Variable für die Tasteneingabe std::string tmp; // String-Variable zur Ablage des Namen um ein String-Array zu durchsuchen do{ // Ausgabe des Menues cout<<" 1 Anzeige der bisher angemeldeten Personen. "<<endl; cout<<" 2 Anmeldung zur Segelwoche. "<<endl; cout<<" 3 Abmeldung. "<<endl; cout<<" 4 Programmende. "<<endl; cout<<" Bitte waehlen sie einem Menuepunkt ueber die Tastaturziffer 1 bis 4 ! "<<endl; cin>>tasteneingabe; // Eingabe über Tastatur if(tasteneingabe=='1') { for(int i=0; i<anzahlAnmeldungen+2; i++) { cout<<namensliste[i]<<endl; } } else if(tasteneingabe=='2') { anzahlAnmeldungen++; cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste hinzuzufügen. \n"; cin>>namensliste[anzahlAnmeldungen]; } else if(tasteneingabe=='3') { cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden. \n"; cin>>tmp; for(int i=0; i<=anzahlAnmeldungen; i++) { if(tmp == namensliste[i]) { namensliste[i]="NULL"; cout<<"Ihr Name wurde von der Anmeldeliste gelöscht \n"; anzahlAnmeldungen--; break; } else cout<<"Name nicht gefunden! \n"; } } else if(tasteneingabe=='4') break; } while(tasteneingabe !='0'); } int main(int argc, char *argv[]) { menue(); if (anzahlAnmeldungen>=4 && anzahlAnmeldungen<6) Boot Boot_4(anzahlAnmeldungen, namensliste, 1000); // Definition und Initialisierung der Unterklasse Boot_4 else if (anzahlAnmeldungen>=6 && anzahlAnmeldungen<8) Boot Boot_6(anzahlAnmeldungen, namensliste, 1300); // Definition und Initialisierung der Unterklasse Boot_6 else if (anzahlAnmeldungen>=7 && anzahlAnmeldungen<8) Boot Boot_8(anzahlAnmeldungen, namensliste, 1500); // Definition und Initialisierung der Unterklasse Boot_8 system("PAUSE"); }Variante_2
#include <cstdlib> #include <iostream> #include <string.h> #include <vector> using namespace std; std::string namen[20]; // initialisieren eines Array aller Namen der Vereinsmitglieder std::string warteliste[10]; // initialisieren eines Array der überschüssigen gebuchten Namen static std::string namensliste[20]; // initialisieren eines Array aller gebuchten Namen int anzahlAnmeldungen=0; // Zähler der Anmeldungen class Boot //Deklaration der Klasse Boot { public: int anzahlBesatzung; // Anzahl der Besatzung std::string besatzungsliste[]; //initialisieren eines Array der Namen von Besatzung double Kosten; //Kosten für Bootcharter Boot(int anzahl, std::string namensliste[], double kostenBoot); //Oberklassenkonstrukter der Klasse Boot mit 3 Übergabewerten }; Boot::Boot(int anzahl, std::string namensliste[], double kostenBoot) //Konstruktor-Methode { anzahlBesatzung=anzahl+1; // for(int i=0; i<=20; i++) (besatzungsliste[i]=namensliste[i]); Kosten=kostenBoot; } int ausgabe(double bootKosten, int anzahl) // Ausgabefunktion mit Rückgabewert { cout<<"Kosten pro Person: (bootkosten/anzahl)"; return int(bootKosten/anzahl); } void menue(void) // Menue-Funktion für diverse Wünsche { int *zeiger=0; // Pointer um die Arrays bearbeiten char tasteneingabe='0'; // Variable für die Tasteneingabe std::string tmp; // String-Variable zur Ablage des Namen um ein String-Array zu durchsuchen do{ // Ausgabe des Menues cout<<" 1 Anzeige der bisher angemeldeten Personen. "<<endl; cout<<" 2 Anmeldung zur Segelwoche. "<<endl; cout<<" 3 Abmeldung. "<<endl; cout<<" 4 Programmende. "<<endl; cout<<" Bitte waehlen sie einem Menuepunkt ueber die Tastaturziffer 1 bis 4 ! "<<endl; cin>>tasteneingabe; // Eingabe über Tastatur if(tasteneingabe=='1') { for(int i=0; i<anzahlAnmeldungen+2; i++) { cout<<namensliste[i]<<endl; } } else if(tasteneingabe=='2') { anzahlAnmeldungen++; cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste hinzuzufügen. \n"; cin>>namensliste[anzahlAnmeldungen]; } else if(tasteneingabe=='3') { cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden. \n"; cin>>tmp; for(int i=0; i<=anzahlAnmeldungen; i++) { if(tmp == namensliste[i]) { namensliste[i]="NULL"; cout<<"Ihr Name wurde von der Anmeldeliste gelöscht \n"; anzahlAnmeldungen--; break; } else cout<<"Name nicht gefunden! \n"; } } else if(tasteneingabe=='4') break; } while(tasteneingabe !='0'); } int main(int argc, char *argv[]) { menue(); if (anzahlAnmeldungen>=4 && anzahlAnmeldungen<6) Boot Boot_4(anzahlAnmeldungen, namensliste, 1000); // Definition und Initialisierung der Unterklasse Boot_4 else if (anzahlAnmeldungen>=6 && anzahlAnmeldungen<8) Boot Boot_6(anzahlAnmeldungen, namensliste, 1300); // Definition und Initialisierung der Unterklasse Boot_6 else if (anzahlAnmeldungen>=7 && anzahlAnmeldungen<8) Boot Boot_8(anzahlAnmeldungen, namensliste, 1500); // Definition und Initialisierung der Unterklasse Boot_8 system("PAUSE"); }
-
Das als Member geht natürlich nicht
std::string besatzungsliste[];Da muss eine zur Compilezeit konstante Zahl stehen. Ich kann mich nur wiederholen: benutze std::vector.
Ansonsten: zeige immer die aktuelle Fehlermeldung.
-
wenn ich std::vector eingebe, bekomme ich
main.cpp:16: error: using-declaration for non-member at class scope main.cpp:16: error: expected `;' before "string"als Fehlermeldung
habe es jetzt so gemacht:#include <cstdlib> #include <iostream> #include <string.h> #include <vector> using namespace std; std::string namen[20]; // initialisieren eines Array aller Namen der Vereinsmitglieder std::string warteliste[10]; // initialisieren eines Array der überschüssigen gebuchten Namen static std::string namensliste[20]; // initialisieren eines Array aller gebuchten Namen int anzahlAnmeldungen=0; // Zähler der Anmeldungen class Boot //Deklaration der Klasse Boot { public: int anzahlBesatzung; // Anzahl der Besatzung string besatzungsliste[]; //initialisieren eines Array der Namen von Besatzung double Kosten; //Kosten für Bootcharter Boot(int anzahl, string namensliste[], double kostenBoot) //Oberklassenkonstrukter der Klasse Boot mit 3 Übergabewerten //Boot(int anzahl, string namensliste[], double kostenBoot):anzahlBesatzung(anzahl), besatzungsliste(namensliste), Kosten(kostenBoot) //Konstruktor-Methode { anzahlBesatzung=anzahl+1; // for(int i=0; i<=20; i++) (besatzungsliste[i]=namensliste[i]); Kosten=kostenBoot; cout<<"Besatzungsanzahl: Charterkosten: Besatzungliste \n"<< anzahlBesatzung << Kosten <<endl; for(int i=0; i<=20; i++) { besatzungsliste[i]=namensliste[i]; cout<<besatzungsliste<<endl; } } }; int ausgabe(double bootKosten, int anzahl) // Ausgabefunktion mit Rückgabewert { return int(bootKosten/anzahl); } void menue(void) // Menue-Funktion für diverse Wünsche { int *zeiger=0; // Pointer um die Arrays bearbeiten char tasteneingabe='0'; // Variable für die Tasteneingabe std::string tmp; // String-Variable zur Ablage des Namen um ein String-Array zu durchsuchen do{ // Ausgabe des Menues cout<<" 1 Anzeige der bisher angemeldeten Personen. "<<endl; cout<<" 2 Anmeldung zur Segelwoche. "<<endl; cout<<" 3 Abmeldung. "<<endl; cout<<" 4 Programmende. "<<endl; cout<<" Bitte waehlen sie einem Menuepunkt ueber die Tastaturziffer 1 bis 4 ! "<<endl; cin>>tasteneingabe; // Eingabe über Tastatur if(tasteneingabe=='1') { for(int i=0; i<anzahlAnmeldungen+2; i++) { cout<<namensliste[i]<<endl; } } else if(tasteneingabe=='2') { anzahlAnmeldungen++; cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste hinzuzufügen. \n"; cin>>namensliste[anzahlAnmeldungen]; } else if(tasteneingabe=='3') { cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden. \n"; cin>>tmp; for(int i=0; i<=anzahlAnmeldungen; i++) { if(tmp == namensliste[i]) { namensliste[i]="NULL"; cout<<"Ihr Name wurde von der Anmeldeliste gelöscht \n"; anzahlAnmeldungen--; break; } else cout<<"Name nicht gefunden! \n"; } } else if(tasteneingabe=='4') break; } while(tasteneingabe !='4'); } int main(int argc, char *argv[]) { menue(); if (anzahlAnmeldungen>=4 && anzahlAnmeldungen<6) Boot Boot_4(anzahlAnmeldungen, namensliste, 1000); // Definition und Initialisierung der Unterklasse Boot_4 else if (anzahlAnmeldungen>=6 && anzahlAnmeldungen<8) Boot Boot_6(anzahlAnmeldungen, namensliste, 1300); // Definition und Initialisierung der Unterklasse Boot_6 else if (anzahlAnmeldungen>=7 && anzahlAnmeldungen<8) Boot Boot_8(anzahlAnmeldungen, namensliste, 1500); // Definition und Initialisierung der Unterklasse Boot_8 system("PAUSE"); }wenn ich 7 Namen eingegeben habe, ist ja anzahlAnmeldungen >=4 erfüllt und der Konstruktor sollte Boot_4 oder Boot_6 anlegen. Leider kommt der " cout<<"Besatzungsanzahl: Charterkosten: Besatzungliste \n"<< anzahlBesatzung << Kosten <<endl; " nicht als ausgabe.

-
Nutze wirklich std::vector, wie manni66 schon schrieb!
Probleme, die du jetzt hast:
- Problem 1: es stehen viele "magische Konstanten" (also sowas wie die "20") im Programm, also zum Beispiel beistatic std::string namensliste[20]; // und dann später for(int i=0; i<=20; i++) { besatzungsliste[i]=namensliste[i]; ...Nun überleg mal, wie viele Strings du hast und wie weit die Schleife geht (von 0 bis 20 sind 21 Elemente).
Daher: nimm einen std::vector<string> für deine Listen. Dann brauchst du auch die Größe nicht selbst in einer zusätzlichen Variablen zu speichern, sondern der vector kennst seine Größe selbst.- Problem 2: Globale Variablen. Vermeide sie wie die Pest! Insbesondere sollte deine Funktion menue nicht globale Variablen ändern, sondern einfach einen vector<string> der eingegebenen Namen zurückgeben.
- Problem 3: merkwürdige Kommentare.
a) so etwas wie "class Boot" brauchst du nicht mit "//Deklaration der Klasse Boot" kommentieren, das ist aus "class Boot" schon sofort klar. Schreib besser einen Kommentar dazu, was die Klasse tun soll. (am besten mehrzeilig vor die Zeile mit "class")
b) was meinst du mit "Unterklasse"? Du hast hier keine Vererbung. Du meinst wohl "Objekte"? Ich meine das hier:if (anzahlAnmeldungen>=4 && anzahlAnmeldungen<6) Boot Boot_4(anzahlAnmeldungen, namensliste, 1000); // Definition und Initialisierung der Unterklasse Boot_4 else if (anzahlAnmeldungen>=6 && anzahlAnmeldungen<8) Boot Boot_6(anzahlAnmeldungen, namensliste, 1300); // Definition und Initialisierung der Unterklasse Boot_6 else if (anzahlAnmeldungen>=7 && anzahlAnmeldungen<8) Boot Boot_8(anzahlAnmeldungen, namensliste, 1500); // Definition und Initialisierung der Unterklasse Boot_8Bei anzahlAnmeldungen==7 ist das noch zwischen >=6 und <8 und geht daher nicht in >=7 und <8. Außerdem ist es komisch, im Boot-Konstruktor schon die Ausgabe zu machen und das Boot-Objekt für einmal kurz zu konstruieren, ohne eine Memberfunktion aufzurufen (nur um den Konstruktor zu haben).
-
#include <cstdlib> #include <iostream> #include <string.h> #include <vector> using namespace std; std::vector<std::string> namen; // initialisieren eines Array aller Namen der Vereinsmitglieder std::vector<std::string> warteliste; // initialisieren eines Array der überschüssigen gebuchten Namen std::vector<std::string> namensliste; // initialisieren eines Array aller gebuchten Namen int anzahlAnmeldungen=0; // Zähler der Anmeldungen class Boot //Deklaration der Klasse Boot { public: int anzahlBesatzung; // Anzahl der Besatzung std::vector<std::string> besatzungsliste; //initialisieren eines Array der Namen von Besatzung double Kosten; //Kosten für Bootcharter Boot(int anzahl, string namensliste[], double kostenBoot) //Konstrukter der Klasse Boot mit 3 Übergabewerten //Boot(int anzahl, string namensliste[], double kostenBoot):anzahlBesatzung(anzahl), besatzungsliste(namensliste), Kosten(kostenBoot) //Konstruktor-Methode { anzahlBesatzung=anzahl+1; // for(int i=0; i<=besatzungsliste.size(); i++) (besatzungsliste[i]=namensliste[i]); Kosten=kostenBoot; cout<<"Besatzungsanzahl: Charterkosten: Besatzungliste \n"<< anzahlBesatzung << Kosten <<endl; for(int i=0; i<besatzungsliste.size(); i++) { besatzungsliste[i]=namensliste[i]; cout<<besatzungsliste[i]<<endl; } } }; int ausgabe(double bootKosten, int anzahl) // Ausgabefunktion mit Rückgabewert { return int(bootKosten/anzahl); } void menue(void) // Menue-Funktion für diverse Wünsche { char tasteneingabe='0'; // Variable für die Tasteneingabe std::string tmp; // String-Variable zur Ablage des Namen um ein String-Array zu durchsuchen do{ // Ausgabe des Menues cout<<" 1 Anzeige der bisher angemeldeten Personen. "<<endl; cout<<" 2 Anmeldung zur Segelwoche. "<<endl; cout<<" 3 Abmeldung. "<<endl; cout<<" 4 Programmende. "<<endl; cout<<" Bitte waehlen sie einem Menuepunkt ueber die Tastaturziffer 1 bis 4 ! "<<endl; cin>>tasteneingabe; // Eingabe über Tastatur if(tasteneingabe=='1') { for(int i=0; i<anzahlAnmeldungen; i++) { cout<<namensliste.at(i)<<endl; } } else if(tasteneingabe=='2') { anzahlAnmeldungen++; cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste hinzuzufügen. \n"; cin >> tmp; //zwischenspeichern der Tastatureingabe namensliste.push_back(tmp); //zuweisen der Zwischenspeicherung an Vector } else if(tasteneingabe=='3') { cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden. \n"; cin>>tmp; for(int i=0; i<=anzahlAnmeldungen; i++) { if(tmp == namensliste[i]) { namensliste[i]="NULL"; cout<<"Ihr Name wurde von der Anmeldeliste gelöscht \n"; anzahlAnmeldungen--; break; } else cout<<"Name nicht gefunden! \n"; } } else if(tasteneingabe=='4') break; } while(tasteneingabe !='4'); } int main(int argc, char *argv[]) { menue(); if (anzahlAnmeldungen>=4 && anzahlAnmeldungen<6) Boot Boot_4(anzahlAnmeldungen, namensliste, 1000); // Definition und Initialisierung der Object Boot_4 //else if (anzahlAnmeldungen>=6 && anzahlAnmeldungen<8) Boot Boot_6(anzahlAnmeldungen, namensliste, 1300); // Definition und Initialisierung der Object Boot_6 //else if (anzahlAnmeldungen>=7 && anzahlAnmeldungen<8) Boot Boot_8(anzahlAnmeldungen, namensliste, 1500); // Definition und Initialisierung der Object Boot_8 system("PAUSE"); }jetzt bekomme ich folgende Fehlermedung:
main.cpp: In function `int main(int, char**)': main.cpp:91: error: no matching function for call to `Boot::Boot(int&, std::vector<std::string, std::allocator<std::string> >&, int)' main.cpp:13: note: candidates are: Boot::Boot(const Boot&) main.cpp:21: note: Boot::Boot(int, std::string*, double)mir würde es schon reichen, wenn aus der class Boot das cout<<besatzungsliste[i]<<endl; ausgefürht wird.
könnt ihr mir den Code dahin gehend umschreiben"
-
Fehlermeldung wurden hiermit beseitigt:
#include <cstdlib> #include <iostream> #include <string.h> #include <vector> using namespace std; std::vector<std::string> namen; // initialisieren eines Array aller Namen der Vereinsmitglieder std::vector<std::string> warteliste; // initialisieren eines Array der überschüssigen gebuchten Namen std::vector<std::string> namensliste; // initialisieren eines Array aller gebuchten Namen int anzahlAnmeldungen=0; // Zähler der Anmeldungen class Boot //Deklaration der Klasse Boot { public: int anzahlBesatzung; // Anzahl der Besatzung std::vector<std::string> besatzungsliste; //initialisieren eines Array der Namen von Besatzung double Kosten; //Kosten für Bootcharter Boot(int anzahl, std::vector<std::string> namensliste, double kostenBoot) //Konstrukter der Klasse Boot mit 3 Übergabewerten //Boot(int anzahl, string namensliste[], double kostenBoot):anzahlBesatzung(anzahl), besatzungsliste(namensliste), Kosten(kostenBoot) //Konstruktor-Methode { anzahlBesatzung=anzahl+1; // for(int i=0; i<=besatzungsliste.size(); i++) (besatzungsliste[i]=namensliste[i]); Kosten=kostenBoot; cout<<"Besatzungsanzahl: Charterkosten: Besatzungliste \n"<< anzahlBesatzung << Kosten <<endl; for(int i=0; i<besatzungsliste.size(); i++) { besatzungsliste[i]=namensliste[i]; cout<<besatzungsliste[i]<<endl; } } }; int ausgabe(double bootKosten, int anzahl) // Ausgabefunktion mit Rückgabewert { return int(bootKosten/anzahl); } void menue(void) // Menue-Funktion für diverse Wünsche { char tasteneingabe='0'; // Variable für die Tasteneingabe std::string tmp; // String-Variable zur Ablage des Namen um ein String-Array zu durchsuchen do{ // Ausgabe des Menues cout<<" 1 Anzeige der bisher angemeldeten Personen. "<<endl; cout<<" 2 Anmeldung zur Segelwoche. "<<endl; cout<<" 3 Abmeldung. "<<endl; cout<<" 4 Programmende. "<<endl; cout<<" Bitte waehlen sie einem Menuepunkt ueber die Tastaturziffer 1 bis 4 ! "<<endl; cin>>tasteneingabe; // Eingabe über Tastatur if(tasteneingabe=='1') { for(int i=0; i<anzahlAnmeldungen; i++) { cout<<namensliste.at(i)<<endl; } } else if(tasteneingabe=='2') { anzahlAnmeldungen++; cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste hinzuzufügen. \n"; cin >> tmp; //zwischenspeichern der Tastatureingabe namensliste.push_back(tmp); //zuweisen der Zwischenspeicherung an Vector } else if(tasteneingabe=='3') { cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden. \n"; cin>>tmp; for(int i=0; i<=anzahlAnmeldungen; i++) { if(tmp == namensliste[i]) { namensliste[i]="NULL"; cout<<"Ihr Name wurde von der Anmeldeliste gelöscht \n"; anzahlAnmeldungen--; break; } else cout<<"Name nicht gefunden! \n"; } } else if(tasteneingabe=='4') break; } while(tasteneingabe !='4'); } int main(int argc, char *argv[]) { menue(); if (anzahlAnmeldungen>=4 && anzahlAnmeldungen<6) Boot Boot_4(anzahlAnmeldungen, namensliste, 1000); // Definition und Initialisierung der Object Boot_4 //else if (anzahlAnmeldungen>=6 && anzahlAnmeldungen<8) Boot Boot_6(anzahlAnmeldungen, namensliste, 1300); // Definition und Initialisierung der Object Boot_6 //else if (anzahlAnmeldungen>=7 && anzahlAnmeldungen<8) Boot Boot_8(anzahlAnmeldungen, namensliste, 1500); // Definition und Initialisierung der Object Boot_8 system("PAUSE"); }leider funzt die class nzw. der Konstrukter immer noch nicht. würde mich über Hilfe freuen.
-
Dein Boot-Konstruktor ist falsch.
for(int i=0; i<=besatzungsliste.size(); i++) (besatzungsliste[i]=namensliste[i]);Die besatzungsliste ist noch leer, du kannst nicht einfach was reinschreiben, ohne vorher Platz zu haben.
Aber mit vector geht das doch viel einfacher, schreib:
besatzungsliste = namensliste;Das kopiert gleich den ganzen vector. Damit läuft es dann schon mal.
Ich würde jetzt mal anfangen, das Boot aufzuräumen:
// Ein Boot mit Besatzung. class Boot { public: vector<string> besatzungsliste; double Kosten; // Kosten für Bootcharter Boot(const vector<string> &namensliste, double kostenBoot) : besatzungsliste(namensliste), Kosten(kostenBoot) { cout << "Besatzungsanzahl: Charterkosten: Besatzungliste \n" << namensliste.size() << ":" << Kosten << endl; for (const auto &name : besatzungsliste) { cout << name << endl; } } };Aufräumschritte danach:
- Ausgabe aus Konstruktor raus und in separate Funktion rein
- irgendwas mit den Kosten anfangen...Weiterhin: du löscht aktuell nicht, sondern ersetzt die Namen nur duch "NULL". Aus einem vector löschen kannst du so:
cout << "Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden.\n"; cin >> tmp; auto pos = find(begin(namensliste), end(namensliste), tmp); if (pos == end(namensliste)) { cout << "Name nicht gefunden! \n"; } else { namensliste.erase(pos); cout << "Ihr Name wurde von der Anmeldeliste gelöscht \n"; }(für std::find musst du <algorithm> includen)
-
danke dir

-
ich habe das Programm etwas optimiert.
Es funzt so weit, wenn ich nichtauto pos = std::find(begin(namensliste), end(namensliste), tmp); if (pos == end(namensliste)) { cout << "Name nicht gefunden! \n"; } else { namensliste.erase(pos); cout << "Ihr Name wurde von der Anmeldeliste gelöscht \n"; }... verwende. Was ist daran falsch?
Fehlermeldung: main.cpp:74: error: ISO C++ forbids declaration of `pos' with no type main.cpp:74: error: `begin' undeclared (first use this function) main.cpp:74: error: (Each undeclared identifier is reported only once for each function it appears in.) main.cpp:74: error: `end' undeclared (first use this function) main.cpp:81: error: no matching function for call to `std::vector<std::string, std::allocator<std::string> >::erase(int&)'#include <cstdlib> #include <iostream> #include <string> #include <algorithm> #include <vector> #include <iterator> using namespace std; std::vector<std::string> namen; // initialisieren eines Array aller Namen der Vereinsmitglieder std::vector<std::string> warteliste; // initialisieren eines Array der überschüssigen gebuchten Namen std::vector<std::string> namensliste; // initialisieren eines Array aller gebuchten Namen int anzahlAnmeldungen=0; // Zähler der Anmeldungen class Boot //Deklaration der Klasse Boot { public: int anzahlBesatzung; // Anzahl der Besatzung vector<string> besatzungsliste; //initialisieren eines Array der Namen von Besatzung double Kosten; //Kosten für Bootcharter Boot(const vector<string> &namensliste, double kostenBoot): besatzungsliste(namensliste), Kosten(kostenBoot) //Konstrukter der Klasse Boot mit 2 Übergabewerten { for(int i=0; i<=besatzungsliste.size(); i++) (besatzungsliste=namensliste); //da besatzungsliste noch leer ist, mit Vector statt Array arbeiten Kosten=kostenBoot; anzahlBesatzung=namensliste.size(); ausgabe(); } void ausgabe() // Ausgabefunktion { printf ("\n Besatzungsanzahl: Charterkosten: \n"); printf ("%d %20.2f \n", besatzungsliste.size(), Kosten ); cout<<"______________________________________________________________________________"<<endl; cout<<"Besatzungliste :\n"; for(int i=0; i<besatzungsliste.size(); i++) { cout<<besatzungsliste.at(i)<<endl; } cout<<" Kosten pro Teilnehmer: \n"<< (Kosten/anzahlBesatzung)<<endl; } }; void menue(void) // Menue-Funktion für diverse Wünsche { char tasteneingabe='0'; // Variable für die Tasteneingabe string tmp; // String-Variable zur Ablage des Namen um ein String-Array zu durchsuchen do{ // Ausgabe des Menues cout<<" 1 Anzeige der bisher angemeldeten Personen. "<<endl; cout<<" 2 Anmeldung zur Segelwoche. "<<endl; cout<<" 3 Abmeldung. "<<endl; cout<<" 4 Programmende. "<<endl; cout<<" Bitte waehlen sie einem Menuepunkt ueber die Tastaturziffer 1 bis 4 ! "<<endl; cin>>tasteneingabe; // Eingabe über Tastatur if(tasteneingabe=='1') { for(int i=0; i<anzahlAnmeldungen; i++) { cout<<namensliste.at(i)<<endl; } } else if(tasteneingabe=='2') { anzahlAnmeldungen++; cout<<"Bitte ihren Namen eingeben, um diesen der Anmeldeliste hinzuzufügen. \n"; cin >> tmp; //zwischenspeichern der Tastatureingabe namensliste.push_back(tmp); //zuweisen der Zwischenspeicherung an Vector } else if(tasteneingabe=='3') { cout << "Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden.\n"; cin >> tmp; auto pos = std::find(begin(namensliste), end(namensliste), tmp); if (pos == end(namensliste)) { cout << "Name nicht gefunden! \n"; } else { namensliste.erase(pos); cout << "Ihr Name wurde von der Anmeldeliste gelöscht \n"; } } else if(tasteneingabe=='4') break; } while(tasteneingabe !='4'); } int main(int argc, char *argv[]) { menue(); if (anzahlAnmeldungen>=4 && anzahlAnmeldungen<6) Boot Boot_4(namensliste, 1000); // Definition und Initialisierung der Object Boot_4 else if (anzahlAnmeldungen>=6 && anzahlAnmeldungen<8) Boot Boot_6(namensliste, 1300); // Definition und Initialisierung der Object Boot_6 else if (anzahlAnmeldungen>=7 && anzahlAnmeldungen<8) Boot Boot_8(namensliste, 1500); // Definition und Initialisierung der Object Boot_8 system("PAUSE"); }
-
Julia_w schrieb:
... verwende. Was ist daran falsch?
Fehlermeldung: main.cpp:74: error: ISO C++ forbids declaration of `pos' with no type main.cpp:74: error: `begin' undeclared (first use this function) main.cpp:74: error: (Each undeclared identifier is reported only once for each function it appears in.) main.cpp:74: error: `end' undeclared (first use this function) main.cpp:81: error: no matching function for call to `std::vector<std::string, std::allocator<std::string> >::erase(int&)'Der Compiler scheint kein C++-11 zu verstehen. Welchen benutzt du? Gegebenenfalls C++-11 einschalten.