Fehlercodes inC++ Bitte um Hilfestellung



  • Hallo zusammen ,

    da ich noch C++ absoluter Anfänger bin macht mir das ziemlich noch Probleme 😞
    ich versuche schon seit Wochen ein Klassen Programm zu programmieren und bekomme die Fehlermeldung leider nicht weg. Könnte ich bitte Euren Rat erhalten.

    Mein Ziel ist es eine Klasse mit Getränk anzufertigen, welche den GetränkeNamen,restliche Flaschenanzahl und den PreisproFlasche ausgeben soll.

    Hier meine fehlercodes noch: ⚠
    [Error] ISO C++ forbids declaration of 'namenWaehlen' with no type [-fpermissive]

    [Error] prototype for 'int Getraenke::namenWaehlen(std::string*)' does not match any in class 'Getraenke'

    [Error] candidate is: int Getraenke::namenWaehlen(std::string)

    [Error] candidate is: char Getraenke::uebrigeFlaschen(int)

    [Warning] name lookup of 'index' changed [enabled by default]

    [Warning] matches this 'char* index(const char*, int)' under ISO standard rules [enabled by default]

    [Warning] matches this 'index' under old rules [enabled by default]

    [Error] invalid types 'float [3][char*(const char*, int)]' for array subscript

    Hier mein Code:

    #include<iostream>

    using namespace std;

    // neue Klasse Getraenke

    class Getraenke
    {
    //die Attribute

    string getraenkeNamen [3];

    int restlicheFlaschen [3];

    float preisProFlasche [3];

    // Die Methoden
    public:

    void init();

    int namenWaehlen(string getraenkeNamen);

    char uebrigeFlaschen(int restlicheFlaschen);

    void kostenFlasche (int anzahl,int preisproFlasche[3],float Ausgabe);
    };

    void Getraenke::init()
    {

    // Die Namen eintragen

    getraenkeNamen[0]="Fanta";

    getraenkeNamen[1]="Bonaqua";

    getraenkeNamen[2]="Bitburger";

    // die restlichen Flaschen
    int anzahl;
    restlicheFlaschen[0]=10;
    restlicheFlaschen[0]=restlicheFlaschen[0]-anzahl;

    restlicheFlaschen[1]=10;
    restlicheFlaschen[1]= restlicheFlaschen[1]-anzahl;

    restlicheFlaschen[2]=10;
    restlicheFlaschen[2]= restlicheFlaschen[2]-anzahl;

    // Der Preis pro Flasche

    preisProFlasche[0]=1.50;"Euro";

    preisProFlasche[1]=1.75;"Euro";

    preisProFlasche[2]=2.00;"Euro";

    }

    Getraenke::namenWaehlen(string getraenkeNamen)
    {

    int auswahl;

    //Die Auswahl

    cout<<"Bitte waehlen Sie einen Namen: "<<endl;

    cout<<"Es gibt folgende Auswahl: "<<endl;

    for (int index =0;index < 3; index++)

    cout<<index+1<<"-"<<getraenkeNamen[index]<<endl;

    cout<<"Geben Sie ihre gewuenschte Nummer ein: ";

    cin>>auswahl;
    }

    Getraenke::uebrigeFlaschen(int restlicheFlaschen)
    {
    // restliche Flaschen ausgeben
    int auswahl;

    if(restlicheFlaschen[auswahl-1]!=0)

    auswahl =auswahl-1;

    else
    {
    cout<<" Es sind leider nicht mehr genuegend Flaschen im Getraenke-"<<
    "automaten vorhanden... bitte anderes Getraenk waehlen"<<endl;

    auswahl = -1;
    }
    return auswahl;
    }

    void Getraenke::kostenFlasche(int anzahl,int preisproFlasche[3], float Ausgabe)
    {
    //die Auswahl
    int auswahl;

    for(int index = 0;index < 3;index++)

    cout<<index+1<<"="<<preisProFlasche[index]<<endl;
    // zuweisung von PreisproFlasche
    preisProFlasche[index]=auswahl *preisProFlasche[index];
    // Zuweisung des Preises in Ausgabe und damit in Komma
    Ausgabe=preisProFlasche[index];

    // Ausgabe des Preises mit Kommazahl
    cout<<"Die ausgegebene Flasche kostet"<<Ausgabe<<"Euro"<<endl;
    }
    Vielen Dank

    😃



  • Bitte tu den Code erstmal in Codetags, das sind die Geräte unter den Smileys.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Wie man seinen Beitrag lesbar formatiert

    Bei der Definition der bemängelten Funktion hast du keinen Rückgabetyp angegeben.

    C und C++ sind zwei ganz unterschiedliche Sprachen.



  • Ich zeig dir wie du das rausfindest, anhand eines Beispiels. Den Rest machst du dann selbst.

    Inforc1 schrieb:

    Hier meine fehlercodes noch: ⚠
    [Error] ISO C++ forbids declaration of 'namenWaehlen' with no type [-fpermissive]

    Du hast hier also eine Fehlermeldung die du nicht verstehst. Kein Problem, vor dem Problem stehen die meisten irgendwann (und auch die meisten Profis immer wieder und wieder - neue Tools, neue Fehlermeldungen).
    Also googelst du sie.
    Intelligenterweise solltest du dabei aber alles entfernen was nicht vom Compiler stammt (bzw. allgemein: nicht von dem Programm das dir die Fehlermeldung ausspuckt). Also speziell Bezeichner deines Programms die darin enthalten sind, Filenamen, Pfade - alles was der Compiler (das Programm) halt als Input gefüttert bekommt und in der Fehlermeldung nur "referenziert". In diesem Fall also den Teil 'namenWaehlen' .
    Du googelst also

    [Error] ISO C++ forbids declaration of with no type [-fpermissive] *

    Und da liest du dir einfach die ersten paar Ergebnisse durch die irgendwie vielversprechend aussehen.

    Wenn ich das google sind die ersten 3 Ergebnisse:
    http://www.cplusplus.com/forum/unices/103997/
    http://stackoverflow.com/questions/7929477/explain-the-error-iso-c-forbids-declaration-of-personlist-with-no-type
    http://stackoverflow.com/questions/23314409/getting-error-iso-c-forbids-declaration-of-with-no-type

    Nummer 3 ist schon ein Volltreffer, darin geht's genau darum was auch du falsch machst.

    *: Wenn du damit keine brauchbaren Ergebnisse bekommst, kannst du versuchen die Suche zu modifizieren. z.B. könnte es notwendig sein den Namen des Programms mit anzugeben welches die Meldung ausgespuckt hat. Also z.B. "g++ [Error] ...". Manchmal, speziell bei sehr langen Meldungen, hilft es auch nur den Anfang der Meldung zu suchen. Oder Teile die nach "Boilerplate" aussehen, also vermutlich in vielen Meldungen vorkommen, wegzulassen. Wie hier das "[Error]". Sei kreativ.



  • Grüß dich inforc1!

    Aller Anfang ist schwer!
    Hier ein Vorschlag:

    #include<iostream>
    
    using namespace std;
    
    // neue Klasse Getraenke
    
    class Getraenke
    {
    // Die Methoden
    public:
    Getraenke(void);   // Konstruktor
    ~Getraenke();      // Destruktor
    int auswahl;
    int anzahl;
    
    //die Attribute
    string getraenkeNamen[3];
    int restlicheFlaschen[3];
    float preisProFlasche[3];
    
    void namenWaehlen(void); // alt war int
    void uebrigeFlaschen(void);
    void kostenFlasche (void);
    };
    
    int main()
    {
    Getraenke durst;
    
    cout << "Testtrunk" << endl;
    durst.namenWaehlen();
    if ((durst.auswahl >= 0) && (durst.auswahl <= 2))
     {
      durst.uebrigeFlaschen();
      durst.kostenFlasche();
     }
     else
      cout << "Fehler Markenauswahl, Programmende" << endl;
    
    return 0;
    }
    
    Getraenke::Getraenke(void)
    {
    // Die Namen eintragen
    getraenkeNamen[0]="Fanta    ";
    getraenkeNamen[1]="Bonaqua  ";
    getraenkeNamen[2]="Bitburger";
    
    // die restlichen Flaschen
    //
    auswahl = 0;
    anzahl  = 0;
    restlicheFlaschen[0]=10;
    restlicheFlaschen[1]=10;
    restlicheFlaschen[2]=10;
    
    restlicheFlaschen[0]= restlicheFlaschen[0]-anzahl;
    restlicheFlaschen[1]= restlicheFlaschen[1]-anzahl;
    restlicheFlaschen[2]= restlicheFlaschen[2]-anzahl;
    
    // Der Preis pro Flasche
    
    preisProFlasche[0]=1.50;  //"Euro";
    preisProFlasche[1]=1.75;  //"Euro";
    preisProFlasche[2]=2.00;  //"Euro";
    }
    Getraenke::~Getraenke(){};   //Destruktor;
    
    void Getraenke::namenWaehlen(void)
    {
     int index;
     //Die Auswahl
     cout<<"Bitte waehlen Sie einen Namen: "<<endl;
     cout<<"Es gibt folgende Auswahl: "<<endl;
     cout.precision(2);
      for (index =0; index < 3; index++)
      cout<< index+1 << "=" << getraenkeNamen[index] << "  Preis: " <<fixed <<preisProFlasche[index] << endl;
     cout<<"Geben Sie ihre gewuenschte Nummer ein: ";
     cin >> auswahl;
     cout << endl;
      auswahl -= 1;
     if ((auswahl < 0) || (auswahl > 2))
      cout << "Falsche Auswahl der Marke";
      else
      {
       cout<<"Gewunschte Anzahl: ";
       cin >> anzahl;
      }
    }
    
    void Getraenke::uebrigeFlaschen(void)
    {
    // restliche Flaschen ausgeben
    //int auswahl;
    
    cout << "Ihre Wahl: " << anzahl<< " Flaschen  Marke";
    cout << getraenkeNamen[auswahl] << "  Preis: " <<preisProFlasche[auswahl] << endl;
    if ((restlicheFlaschen[auswahl]) < anzahl)
     {
      cout<< "Es sind leider nicht mehr genuegend Flaschen im Getraenke-"<< endl
             << "automaten vorhanden:" << endl;
      cout<< "Restmenge: " << restlicheFlaschen[auswahl] <<"... bitte anderes Getraenk waehlen"<< endl;
     }
     else
     {
      restlicheFlaschen[auswahl] -= anzahl;
      cout << "Verbleibende Menge: " << restlicheFlaschen[auswahl] << endl;
     }
    
    }
    
    void Getraenke::kostenFlasche(void)
    {
     cout<<"Preis pro Flasche: "<< preisProFlasche[auswahl] <<" Euro"<<endl;
     cout.precision(2);
     cout<<"Gesamtpreis: " << preisProFlasche[auswahl] * anzahl << "Euro" <<endl;
    }
    

    Du hast den Destruktor vergessen!
    Packe lieber Variablen und Arrays, die nur von der Klasse benötigt werden,
    in die Klasse rein. Eventuell verzettelst du dich sonst bei größeren
    Programmen mit den globalen Variablen.
    Bei der Definiton und der Deklaration des Konstrukors und des Destruktors
    sind keine "Rückgabetypen" erlaubt. Auch nicht void;

    Und lass dir eines sagen:

    "Fehlen kann ein jeder, doch wie einer seines Fehlens Folgen trägt,
    unterscheidet den reinen vom gemeinen Geiste"!

    Johann Wolfgang von Goethe

    Salvo errore et omissione

    Gruß
    rustyoldguy


  • Mod

    rustyoldguy schrieb:

    Du hast den Destruktor vergessen!

    Erklär mal den Sinn deines leeren Destruktors. Gibt keinen, oder?



  • hustbaer schrieb:

    Ich zeig dir wie du das rausfindest, anhand eines Beispiels. Den Rest machst du dann selbst.
    [...]

    Macht mich immer glücklich, wenn ich solche Posts sehe. Echt jetzt 👍



  • Hi!

    Der Destruktor ist das Gegenstück zum Konstruktor. Er hat die Aufgabe, die
    Initialisierung des Konstruktors zurück zu nehmen, welche mit der
    automatischen Auflösung des Speicherbereichs nicht erledigt sind.
    Er wird also GEGEBENENFALLS
    automatisch aufgerufen, zwar nicht beim Beginn, sondern am Ende der
    "Lebenszeit" eines Objekts, etwa beim Rücksprung aus einer Funktion, die
    ein Objekt als lokale Variable definiert.
    Sein Zweck sind quasi ausschließlich Aufräumarbeiten, wie die
    Freigabe von dynamisch belegten Speicherbereichen.dadurch, gegebenenfalls
    etwa für das schließen oder entsperren von Dateien.

    Wenn ein Datenelement selbst ein Objekt einer Klasse ist, wird auch
    dessen Destruktor aufgerufen. Wenn z.B. ein mit new angelegte Objekt
    (dynamisch belegter Speicher) mit delete wieder gelöscht wird,
    beim Verlassen eines Funktionsblocks, in dem Lokale Objekte
    definiert wurden.

    Ob ein Destruktor für eine Klasse definiert werden muß oder nicht,
    hängt von den jeweiligen Anforederungen ab. Für Objekte welche über ihren
    Konstruktor oder eine andere Methode selbständig dynamischen Speicherplatz
    belegen, ist ein Destruktor fur Freigabe dieser Bereiche eine unbedingte
    Vorraussetzung.
    Destruktoren sind nicht überladbar und können keine Parameter
    übernehmen und besitz auch keinen Ergebnistyp.

    Der Destruktor sollte aber trotzdem, auch wenn er leer ist, drin stehen,
    viele Compiler geben eine Fehlermeldung raus, wenn er fehlt. Außerdem
    spart man sich bei späteren Änderungen Tipparbeit.



  • rustyoldguy schrieb:

    Der Destruktor sollte aber trotzdem, auch wenn er leer ist, drin stehen,

    Wozu?!?!

    viele Compiler geben eine Fehlermeldung raus, wenn er fehlt.

    Dann ist der Compiler kaputt.



  • HarteWare schrieb:

    hustbaer schrieb:

    Ich zeig dir wie du das rausfindest, anhand eines Beispiels. Den Rest machst du dann selbst.
    [...]

    Macht mich immer glücklich, wenn ich solche Posts sehe. Echt jetzt 👍

    Ich hab keine Ahnung ob das Sarkasmus/Zynismus sein soll oder nicht. Echt jetzt.

    ps: Nach Lesen einiger deiner anderen Beitrage nehme ich an du meinst es Ernst. OK. Dann danke 🙂 War mir nur auf Grund der Formulierung grad nicht sicher.



  • rustyoldguy schrieb:

    Der Destruktor sollte aber trotzdem, auch wenn er leer ist, drin stehen,

    Ich sage das ist kompletter Unfug. Kannst du diese deine Meinung denn auch irgendwie begründen?

    rustyoldguy schrieb:

    viele Compiler geben eine Fehlermeldung raus, wenn er fehlt.

    Das ist einfach nur falsch.

    rustyoldguy schrieb:

    Außerdem spart man sich bei späteren Änderungen Tipparbeit.

    WTF?



  • hustbaer schrieb:

    rustyoldguy schrieb:

    Der Destruktor sollte aber trotzdem, auch wenn er leer ist, drin stehen,

    Ich sage das ist kompletter Unfug. Kannst du diese deine Meinung denn auch irgendwie begründen?

    Das ist nicht nur Unfug, sondern sogar gefährlicher Unfug...


  • Mod

    dot schrieb:

    hustbaer schrieb:

    rustyoldguy schrieb:

    Der Destruktor sollte aber trotzdem, auch wenn er leer ist, drin stehen,

    Ich sage das ist kompletter Unfug. Kannst du diese deine Meinung denn auch irgendwie begründen?

    Das ist nicht nur Unfug, sondern sogar gefährlicher Unfug...

    Nein, der Unfug ist nicht gefährlich, sondern VC++.



  • Unfug, der auf einem der am weitesten verbreiteten Compiler zu unnötig ineffizientem Code führt, würde ich als gefährlichen Unfug einstufen...



  • Ums nochmal explizit zu sagen, der Compiler generiert implizit einen default destructor, wenn der user keinen definiert. Oder so ähnlich.

    @hustbaer, ja war ernst gemeint, da gibts son Sprichwort, mit gib nem Mann nen Fisch und ernähre ihn für einen Tag, bring ihm bei zu Fischen und ernähre ihn sein ganzes Leben lang, oder so ähnlich. Das lässt sich auf die selbstständige Fehlerbehebung auch irgendwie übertragen.


Log in to reply