fehlerhafter Konstruktur einer Klasse



  • 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 bei

    static 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_8
    

    Bei 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 nicht

    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";
                  }
    

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


Anmelden zum Antworten