Fehler beim ersten OOP



  • sodale, nun habe ich alles umgebaut.

    Ich habe nun eine Klasse Kunde und eine Klasse Automat, die Klasse Kunde ist komplett public da der Automat eh nur das machen kann was der Kunde eingibt, die Klasse Automat hat intern einige aufgaben die den Kunden nichts angehen, sprich berechnung des Wechselgeldes und überprüfung des Alters. Ich hoffe soweit habe ich das richtig gesehen, wenn nicht bitte mitteilen.

    Nun habe ich jedoch folgendes Problem bei der privaten Funktion Wechselgeld()

    folgende Fehler gibt mir MVS aus:
    
    Fehler	1	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol
     ""private: double __thiscall Automat::Wechselgeld(double)" 
    (?Wechselgeld@Automat@@AAENN@Z)" in Funktion ""private: void __thiscall 
    Automat::SetAltersnachweis(double,double)" 
    (?SetAltersnachweis@Automat@@AAEXNN@Z)".	Automat.obj	
    Zigarettenautomat
    
    Fehler	2	fatal error LNK1120: 1 nicht aufgelöste externe Verweise.	
    C:\Dokumente und Einstellungen\dm\Desktop\C++_Übungen\Zigarettenautomat\Debug
    \Zigarettenautomat.exe	Zigarettenautomat
    

    Es tut mir wirklich leid, ich kann damit rein garnichts anfangen, iwie ist die Fehlermeldung für mich alles andere als Ausagekräftig.

    Hier mal meine Codes:

    int main

    #include <iostream>
    #include "Kunde.h"
    #include "Automat.h"
    
    Kunde k;
    Automat a;
    using namespace std;
    
    int main()
    {
      bool beenden = true;
      do
      {
        cout<<"Herzlich Willkommen"<<endl;
        cout<<"Bitte Geld einwerfen!"<<endl;
        double gezahlt=0;
        double gesamt=k.GetGeld(gezahlt);//Zahlung durch Kunde
        cout<<"Zahlung erfolgreich, bitte Altersnachweis tätigen!";
        int Datum=0;
        double jahreszahl = k.GetAltersnachweis(Datum);//Altersnachweis von Kunde
        a.SetGeld(gesamt, jahreszahl);
    
      }while(!beenden);
      system("PAUSE");
      return 0;
    }
    

    die Automat.h

    #ifndef AUTOMAT_H
    #define AUTOMAT_H
    
    class Automat
    {
    public:
        double SetGeld(double gesamt, double jahreszahl);
    
    private:
        double Wechselgeld(double gesamt);
        void SetAltersnachweis(double jahreszahl, double gesamt);
    };
    
    #endif AUTOMAT_H
    

    die Kunde.h

    #ifndef KUNDE_H
    #define KUNDE_H
    
    class Kunde
    {
    
    public:
      double GetGeld(double gezahlt);
      int GetAltersnachweis(int Datum);
      void Zigaretten();
    
    private:
    
    };
    #endif
    

    die Kunde.cpp

    #include <iostream>
    #include "Kunde.h"
    
    using namespace std;
    
    double Kunde::GetGeld(double gezahlt)
    {
      double einwurf;
      do
      {
        cout<<"Es Fehlen noch! "<<5-gezahlt<<" EUR"<<endl;
    
        cin>>einwurf;
        if (einwurf==0.5 || einwurf==1 || einwurf==2)
        {
           gezahlt += einwurf;
        }
        else 
        {  
          cout<<"Bitte nur 0,50 EUR, 1 EUR oder 2 EUR einwerfen"<<endl;         
        }
    
      }while (gezahlt<=5.0);
      cout<<"Gesamtbetrag mom: "<<gezahlt<<endl;
      return gezahlt;
    }
    
    int Kunde::GetAltersnachweis(int Datum)
    {
      cout<<"Bitte geben Sie Ihr Geburtsdatum ein!"<<endl;
      cin>>Datum;
      return Datum;
    }
    

    und die Automat.cpp

    #include <iostream>
    #include "Automat.h"
    
    using namespace std;
    
    double Wechselgeld(double gesamt)
    {
         {
           double Auszahlung = gesamt-5.0;
           cout<<"Wechselgeld beträgt "<<Auszahlung<<" ! "<<endl;
           cout<<"Bitte entnehmen Sie Ihr wechselgeld"<<endl;
         }
         return gesamt;
    }
    
    double Automat::SetGeld(double gesamt, double jahreszahl)
    {   
    
        SetAltersnachweis(jahreszahl, gesamt);
        return gesamt; 
    }
    
    void Automat::SetAltersnachweis(double jahreszahl, double gesamt)
    {
      int tutu = (double) jahreszahl;
      int akt_date=2010;
      if ((akt_date-tutu)<=18)//Wie kann ich auf dd.mm.yyyy prüfen
      {
    
        cout<<"Zigaretten darf man erst mit 18 kaufen"<<endl;
        cout<<"Geld wird zurückgegeben: "<<endl;
    
      }
      else
      {
        cout<<"Bitte Marke wählen"<<endl;
        Wechselgeld(gesamt);//Ausgabe Wechselgeld
      }
    }
    

    Bitte berichtet mich gleich wenn dies kein Objektorientiertes Programm ist. Ist mein erstes Objektorientiertes Programm 😞 . Und ich tue mich noch sehr sehr schwer zu wissen wann ich eine Klase, Objekt und Funktion benötige.

    Bedanke mich herzlich für Hilfe


  • Administrator

    Vor der Funktionsdefinition Wechselgeld fehlt ein Automat:: .

    Grüssli



  • In Automat.cpp fehlt ein Automat:: vor Wechselgeld.
    Also double Automat::Wechselgeld statt double Wechselgeld.



  • Mensch, vielen Dank!

    ich suche da schon seit knapp ner Stunde.

    Aber bitte noch ne kurze Frage, ist das ein ordentliches OOP?


  • Administrator

    samkirchner schrieb:

    Aber bitte noch ne kurze Frage, ist das ein ordentliches OOP?

    Schwer zu beantworten bei so wenig Code. Zudem ist schon nur die Frage nach dem "ordentliches OOP" sehr umstritten.
    Zwei Kritikpunkte hätte ich schon, diese haben aber nicht wirklich was mit OOP zu tun:
    1. Vermische nicht Deutsch und Englisch. Schon gar nicht in Funktionsnamen. Das ist einfach nur schrecklich zu lesen. Am besten beschränkst du dich vollständig auf Englisch.
    2. Deine Benennungen sind ziemlich verwirrend und spiegeln nicht das wieder, was es tatsächlich ist oder passiert. Bestes Beispiel finde ich SetAltersnachweis , welches gar nicht ausschliesslich den Altersnachweis setzt.

    Also an den Bezeichnungen solltest du noch dringend arbeiten.

    Grüssli



  • Ok, dann werde ich dies in Zukunft komplett english halten und auf meine Variablenbzeichnungen besser achten, danke.


Log in to reply