E
Ich kann Dir einen prinzipiellen Ansatz zeigen. Hier das Zusammenspiel zwischen Klasse Automat und Person, also eine Simulation:
// main.cpp
// Basiert auf einem Programm aus dem Lehrbuch von Prof. Ulrich Breymann
// C++ Eine Einführung, 5. Auflage, Hanser-Verlag
#include "person.h"
#include "automat.h"
#include <cstdlib>
#include <conio.h>
int zufall( int x ) // Pseudo-Zufallszahl zwischen 0 und x
{
return rand() % x + 1;
}
int main()
{
const int DOSENANZAHL = 5, DOSENPREIS = 2, MAXGELD = 10;
GetraenkeAutomat objAutomat( DOSENANZAHL, DOSENPREIS ); // Objekt Automat
while( !objAutomat.istGesperrt() ) // solange Dosen im Automat sind
{
cout << endl << " Anzahl Dosen: " << objAutomat.getAnzahlDosen() << endl;
Person objPerson( zufall(MAXGELD) ); // eine Person betritt die Szene (ctor)
if( objPerson.genugGeld( objAutomat.getGetraenkePreis() ) )
{
int geld = zufall( objPerson.wievielGeld() );
objPerson.GeldEinwerfen( objAutomat, geld );
objPerson.KnopfDruecken( objAutomat );
if( objAutomat.istRueckgeldVorhanden() )
objPerson.GeldEntnehmen( objAutomat.GeldRueckGabe() );
if( objAutomat.DoseHerausgegeben() )
{
objPerson.DoseEntnehmen( objAutomat );
objPerson.trinkt();
}
if( objAutomat.istGesperrt() )
cout << endl << " AUTOMAT GESPERRT!!! (leer)" << endl << endl;
}
else objPerson.sagt( " Leider zuwenig Geld." );
}// eine Person verlässt die Szene (dtor)
getch();
}
// person.h
// Alle Methoden sind inline, weil sie sehr kurz sind, daher keine cpp-Datei.
#ifndef PERSON_H
#define PERSON_H
#include <iostream>
#include <string>
#include "automat.h"
using namespace std;
class Person
{
public:
// Konstruktor mit Initialisierungsliste
Person( int anfaenglicheGelEuroenge ) : Geld( anfaenglicheGelEuroenge )
{
cout << endl << " Eine Person mit " << Geld << " Euro kommt." << endl;
}
~Person() // Destruktor
{
cout << " Eine Person geht mit " << Geld << " Euro." << endl;
}
bool genugGeld( int Preis ) const { return Preis <= Geld; }
int wievielGeld() const { return Geld; }
void sagt( string text ) const { cout << text << endl; }
void trinkt() const { sagt(" Person sagt: \"gluckgluck... aaaah!\""); }
void DoseEntnehmen( GetraenkeAutomat & a ) const { a.DoseFreigeben(); }
void GeldEntnehmen( int Muenzen) { Geld += Muenzen; }
void GeldEinwerfen( GetraenkeAutomat & a, int Muenzen )
{
Geld -= Muenzen;
a.MuenzenAkzeptieren( Muenzen );
}
void KnopfDruecken( GetraenkeAutomat & a ) { a.GeldPruefenUndDoseHerausgeben(); }
private:
int Geld; // Die wichtigste Eigenschaft von Kunden!
};
#endif
// automat.h
// Klassendeklaration zur Simulation eines Getränkeautomaten
#ifndef AUTOMAT_H
#define AUTOMAT_H
class GetraenkeAutomat
{
public:
GetraenkeAutomat( int Anzahl, int Dosenpreis );
bool istGesperrt() const { return gesperrt; }
bool istRueckgeldVorhanden() const
{
return Rueckgeld > 0;
}
bool DoseHerausgegeben() const { return DoseInAusgabe;}
int getGetraenkePreis() const { return PreisProDose;}
void DoseFreigeben() { DoseInAusgabe = false; }
void GeldPruefenUndDoseHerausgeben();
void MuenzenAkzeptieren( int M );
int GeldRueckGabe();
int getAnzahlDosen() { return AnzahlDosen; }
private:
int AnzahlDosen;
int PreisProDose;
int Einnahmen;
int eingeworfeneMuenzen;
int Rueckgeld;
bool DoseInAusgabe;
bool gesperrt;
GetraenkeAutomat( const GetraenkeAutomat & ); // Übergabe per Wert verbieten
};
#endif
// automat.cpp
#include "automat.h"
#include <iostream>
using namespace std;
GetraenkeAutomat::GetraenkeAutomat( int Anzahl, int Dosenpreis)
: AnzahlDosen(Anzahl), PreisProDose(Dosenpreis), Einnahmen(0), Rueckgeld(0),
DoseInAusgabe(false), gesperrt(Anzahl <= 0)
{}
void GetraenkeAutomat::GeldPruefenUndDoseHerausgeben()
{
if( gesperrt )
{
cout << " Automat leer/gesperrt!" << endl;
Rueckgeld = eingeworfeneMuenzen;
}
else
if (eingeworfeneMuenzen < PreisProDose)
{
cout << " Geld reicht nicht!" << endl;
Rueckgeld = eingeworfeneMuenzen;
}
else
{
Einnahmen += PreisProDose;
Rueckgeld = eingeworfeneMuenzen - PreisProDose;
cout << " Dose faellt in Ausgabe! (rumpel)" << endl;
DoseInAusgabe = true;
if( --AnzahlDosen == 0 )
gesperrt = true;
}
}
void GetraenkeAutomat::MuenzenAkzeptieren(int M)
{
eingeworfeneMuenzen = M;
cout<< " " << M << " Euro eingeworfen" << endl;
}
int GetraenkeAutomat::GeldRueckGabe()
{
int temp = Rueckgeld;
Rueckgeld = 0;
cout << " Geldrueckgabe: " << temp << " Euro" << endl;
return temp;
}