Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » fehlerhafter Konstruktor in Klasse

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
16.10.2016, 11:57 Uhr
~Julia_w
Gast


Hallo Progger,

ich kriege kriege folgende Fehlermeldung während dem Kompilieren:

Code:
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

C++:
#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


C++:
#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;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.10.2016, 15:33 Uhr
~toxic
Gast


Hi,

du hast deine Funktion "ausgabe" mit im konstruktor stehen, die muss aber außerhalb sein


C++:
class Boot
{
public:  
    int anzahlBesatzung;
    std::string besatzungsliste[];
    double Kosten;
    Boot(int anzahl, std::string namensliste[anzahl], double kostenBoot);
};

Boot::Boot(int anzahl, std::string namensliste[anzahl],double kostenBoot)
{
    anzahlBesatzung=anzahl+1;
    for( int i = 0; i <= strlen(namensliste); i++ )
    {
        besatzungsliste[i] = namensliste[i];
    }
    Kosten = kostenBoot;
}
Boot::int ausgabe(double bootKosten, int anzahl)
{
    cout << "Kosten pro Person: (bootkosten/anzahl)";
    return int( bootkosten / anzahl );
}


wobei die ausgabefunktion auch etwas sinfrei ist, sie gibt die berechnug nur zurück und nicht aus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.10.2016, 15:50 Uhr
~Julia_w
Gast


Hi toxic,
habe es korrigiert. jetzt läuft die Compilierung wenigstens.
Wann benötige ich den aber die Variante mit der Kobnstruktor-Methode? Nur, wenn mann den Konstruktor überladen möchte, oder wann?

Variante_1

C++:
#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");
}





Variante_2

C++:
#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");
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.10.2016, 09:16 Uhr
ao

(Operator)


In der Variante 2 fehlen eine schließende Klammer und ein Semikolon, und zwar hier am Ende:


C++:
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;
};  // #### ao: Hier ist das Semikolon überflüssig (richtet aber keinen Schaden an)

};  // #### ao: Diese Zeile fehlt



Wenn du das so machst, sind beide Varianten gleichwertig. Eine Überladung des Konstruktors ist das in beiden Fällen NICHT.

Übrigens scheint mir hier noch ein Missverständnis vorzuliegen:

C++:
    if (anzahlAnmeldungen>=4 && anzahlAnmeldungen<6)
        Boot Boot_4(anzahlAnmeldungen, namensliste, 1000); // Definition und Initialisierung der Unterklasse Boot_4


Es gibt keine Unterklasse Boot_4. Boot_4 ist keine Klasse, sondern eine Variable vom Typ Boot. Boot_6 und Boot_8 ebenfalls.

Und du solltest möglichst bald dieses std::string namensliste[] durch std::vector<std::string> namensliste oder std::list oder ähnliches ersetzen. Es ist nicht gut, wenn sich "altes C" in C++ zu sehr breitmacht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.10.2016, 20:33 Uhr
~Julia_w
Gast


ich habe das Programm etwas optimiert.
Es funzt so weit, wenn ich nicht

C++:
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?

Code:
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&)'




C++:
#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");
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.10.2016, 09:43 Uhr
ao

(Operator)


So sollte es funktionieren:

C++:
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
        
        // Menü anzeigen und Taste abholen

        // Tasten 1 und 2 behandeln

        else if(tasteneingabe=='3')
        {
            cout << "Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden.\n";
            cin >> tmp;
            std::vector<std::string>::iterator iter = std::find(namensliste.begin(), namensliste.end(), tmp);
            if (iter == namensliste.end())
            {
                cout << "Name nicht gefunden! \n";
            }
            else
            {
                namensliste.erase(iter);
                cout << "Ihr Name wurde von der Anmeldeliste gelöscht \n";
            }
        }
        else if(tasteneingabe=='4') break;
    }
    while(tasteneingabe !='4');
}



Den Anfang der Namensliste bekommst du nicht mit begin(liste), sondern mit liste.begin(), das Ende entsprechend.

Und std::find liefert nicht die Position des Treffers, sondern einen sogenannten Iterator. Ein Iterator ist ein Objekt, das mit ++ und -- zwischen begin() und end() hin- und herlaufen kann, und der Rückgabewert von find ist ein Iterator, der auf den Treffer verweist.

Dieses Iterator-Modell wird von allen Containerklassen unterstützt, so kann man leicht den Container wechseln, ohne die ganze Programmierung ändern zu müssen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.10.2016, 19:25 Uhr
~Julia_w
Gast


Danke sehr @ all

Jetzt funzt es.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.10.2016, 21:37 Uhr
~Julia_w
Gast


ich habe das Abmelden von der Namensliste verändert:

C++:
if((namensliste.size()<8)&&(warteliste.size()>=1)) // wenn Namensliste weniger als 8 Personen UND Warteliste mehr als 1 Person, dann...
                {
                       namensliste.push_back(warteliste.at(0)); //verschiebe Warteliste(0) zu Namensliste(7)
                       warteliste.push_back(std::move(warteliste.at(0)));
                }


... und kriege hier den Fehler;
Zeile 90: `move' is not a member of `std'


C++:
#include <cstdlib>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <utility>
using namespace std;

std::vector<std::string> namen; // initialisieren eines Vector/Array aller Namen der Vereinsmitglieder
std::vector<std::string> warteliste; // initialisieren eines Vector/Array der überschüssigen gebuchten Namen
std::vector<std::string> namensliste; // initialisieren eines Vector/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 ohne Kapitän
  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; //Kosten für den Bootscharter zuweisen von Übergabewert
     anzahlBesatzung=namensliste.size(); //übergebene Namensliste der Besatzungsliste zuweisen
     ausgabe(); //Ausgabefunktion aufrufen
   }
  void ausgabe() // Ausgabefunktion
  {
     printf ("\n Besatzungsanzahl: Charterkosten:  \n"); //Ausgabe Überschrift
     printf ("%5d %25.2f \n", besatzungsliste.size(), Kosten  ); // formatierte Ausgabe der Besatzungsanzahl und der Kosten für Bootscharter für gebuchtes Boot
     cout<<"______________________________________________________________________________"<<endl;
     cout<<"Besatzungliste :\n";
     for(int i=0; i<besatzungsliste.size(); i++) //Ausgabe der Besatzungsliste
     {
     cout<<besatzungsliste.at(i)<<endl;
     }  
     cout<<"        Kosten pro Teilnehmer: \n"<< (Kosten/(anzahlBesatzung-1))<<endl; // Ausgabe der Kosten pro (Teilnehmer-Kapitän)
  }
};  




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') // wenn, Eingabe Ziffe 1
         {
                               for(int i=0; i<namensliste.size(); i++)
                               {
                               cout<<namensliste.at(i)<<endl;
                               }                      
         }
         else if(tasteneingabe=='2') // wenn, Eingabe Ziffe 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
              if(namensliste.size()>7)
               {
                    warteliste.push_back(tmp); //zuweisen der Zwischenspeicherung an Vector                    
               }
             }
        else if(tasteneingabe=='3') // wenn, Eingabe Ziffe 3
        {
            cout << "Bitte ihren Namen eingeben, um diesen der Anmeldeliste abzumelden.\n";
            cin >> tmp; //Einlesen des Namen über Tastatur in tempo. Stringbariablle
            std::vector<std::string>::iterator iter = std::find(namensliste.begin(), namensliste.end(), tmp); // Durchsuchen des Vector "namenlsite"
            if (iter == namensliste.end()) //...Durchlauf beendet
            {
                cout << "Name nicht gefunden! \n";
            }
            else
            {
                namensliste.erase(iter); //...Vectorinhalt == iteratorinhalt
                cout << "Ihr Name wurde von der Anmeldeliste gelöscht \n";
                if((namensliste.size()<8)&&(warteliste.size()>=1)) // wenn Namensliste weniger als 8 Personen UND Warteliste mehr als 1 Person, dann...
                {
                       namensliste.push_back(warteliste.at(0)); //verschiebe Warteliste(0) zu Namensliste(7)
                       warteliste.push_back(std::move(warteliste.at(0)));
                }
            }
        }
        else if(tasteneingabe=='4') break; // wenn, Eingabe Ziffe 4
    }
    while(tasteneingabe !='4'); // Menüabbruch wenn, Eingabe Ziffe 4
}

int main(int argc, char *argv[])
{
    menue(); //Aufruf des Menü
    if (anzahlAnmeldungen>=3 && anzahlAnmeldungen<5) Boot Boot_4(namensliste, 1000); // Definition und Initialisierung der Object Boot_4
    else if (anzahlAnmeldungen>=5 && anzahlAnmeldungen<7) Boot Boot_6(namensliste, 1300); // Definition und Initialisierung der Object Boot_6
    else if (anzahlAnmeldungen=7) Boot Boot_8(namensliste, 1500); // Definition und Initialisierung der Object Boot_8

    system("PAUSE");
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.10.2016, 10:33 Uhr
ao

(Operator)



Zitat:
Zeile 90: `move' is not a member of `std'

Falscher C++-Standard. Du musst mit c++11 oder c++14 übersetzen. Hier stehts, ganz oben: http://en.cppreference.com/w/cpp/utility/move

Wie das bei deinem Compiler geht, findest du in der Doku dazu.

Ich hab mir die Beschreibung nicht durchgelesen, aber bist du sicher, dass das so funktioniert? Dass warteliste[0] tatsächlich entfernt wird und nicht als "Zombie-Objekt" in der Liste zurückbleibt? Check das mal.

Und warum soll überhaupt ein Teilnehmer, der von der Warteliste auf die Namensliste übernommen wurde, außerdem noch am Ende der Warteliste stehen? Dann hast du ihn doch doppelt.

Und da sind noch mehr Fehler:
1. if (anzahlAnmeldungen=7) <--- Zuweisung, nicht Vergleich!
2. printf ohne stdio.h - schmeiß das weg und nimm cout.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.10.2016, 12:37 Uhr
ao

(Operator)


Und noch ein Fehler in der Business-Logik:

C++:
         else if(tasteneingabe=='2') // wenn, Eingabe Ziffe 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
              if(namensliste.size()>7)
               {
                    warteliste.push_back(tmp); //zuweisen der Zwischenspeicherung an Vector                    
               }
             }


Der neue Name wird immer der Namensliste hinzugefügt, auch wenn die schon voll ist. Sie wird dann noch voller. Namen ab 8 werden zusätzlich der Warteliste hinzugefügt, sind also doppelt im System, einmal im mittlerweile überladenen Boot und einmal auf der Warteliste.

Und: Wenn sich jemand abmeldet (Ziffer 3), wird sein Name nur in der Namensliste gesucht, aber nicht in der Warteliste. Wer nur auf der Warteliste steht, kann sich also nicht austragen.

Wenn man das alles zusammennimmt, heißt das: Wer einmal auf der Warteliste steht, kommt da nie wieder raus. Er kann sich nicht vollständig abmelden (siehe oben), und wenn er ins Boot nachrückt, weil sich ein anderer abmeldet, bleibt er trotzdem in der Warteliste.

Tipp: Du solltest (für Testzwecke) eine Routine programmieren, die sämtliche Programmzustände (also die Namensliste und die Warteliste) ausgibt, und diese Routine nach jeder Änderung (Taste 2 oder 3) aufrufen. So fällt es auf, wenn eine der Listen immer nur wächst und nie schrumpft. Wenn das Programm fertig ist, kannst du das wieder verstecken.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: