Dynamisches Objekt (Intanz erzeugen)



  • Wo ist jetzt das Problem, es "dynamisch" zu machen?



  • Ich erhalte eine Fehlermeldung undzwar <

    Fehler 2 error C2661: 'Getraenkeautomat<1>::Getraenkeautomat': Keine überladene Funktion akzeptiert 3 Argumente c:\users\ippo\documents\visual studio 2013\projects\getraenkeautomat\getraenkeautomat\main.cpp 11 1 Getraenkeautomat

    hier ist die Header Datei dazu

    #ifndef GETRAENKEAUTOMAT_H_INCLUDED
    #define GETRAENKEAUTOMAT_H_INCLUDED
    #include <string>
    #include <thread>
    #include <chrono>
    #include <iostream>
    #include "Person.h"
    using namespace std;
    // Template function überdenken
    template<unsigned price>
    class Getraenkeautomat
    {
    public:
    	Getraenkeautomat(const string& gt, unsigned stk, const Person& Pf);
    	Getraenkeautomat() = default;
    	void print() const;
    	void getraenkKaufen(int);
    	~Getraenkeautomat();
    	bool isAviable() const { return empty; }
    private:
    	int preis = 0;
    	bool empty = true;
    	unsigned getraenkeanzahl = 50;
    	string getraenk = "Cola";
    	Person& ReferencePerson;
    };
    
    // Konstruktor der Klasse - Die Attribute mit Standartwerten initialisieren
    template<unsigned price>
    Getraenkeautomat< price>::Getraenkeautomat(const string& gt, unsigned stk, const Person& Pf)
    	: getraenk(gt), empty(false), getraenkeanzahl(stk), preis(price), ReferencePerson(Pf)
    {
    	cout << getraenk << " Getränkeautomat wurde aufgestellt." << endl;
    }
    
    // Person die dinge Kaufen wird mit übergeben
    template<unsigned price>
    void Getraenkeautomat<price>::print() const
    {
    	cout << "-----------------------------------------";
    	cout << "\nGetränk     :" << getraenk;
    	cout << "\nAnzahl Stück:" << anzahl;
    	cout << "\nEinzel Preis:" << preis;
    	cout << "-----------------------------------------\n";
    }
    
    // Getränkeautomaten Klasse- void function
    template<unsigned price>
    void Getraenkeautomat<price>::getraenkKaufen(int anz)
    {
    	if (getraenkeanzahl == 0)
    	{
    		empty = true;
    		break;
    		cout << "Programm wird in kürze geschlossen.\n";
    		this_thread::sleep_for(chrono::seconds(10));
    		exit(1); // Programm schließen
    	}
    	else
    	{
    		unsigned getraenkmalpreis = preis* anz;
    		if (ReferencePerson.guthaben < getraenkmalpreis)
    		{
    			cout << "Sie haben nicht soviel guthaben\n";
    			cout << "Versuchen sie es mit etwas weniger.\n";
    		}
    		else
    		{
    			ReferencePerson.guthaben -= getraenkmalpreis;
    			getraenkeanzahl -= anz;
    		}
    	}
    }
    
    // Destruktor der Klasse- Konstrukt
    template<unsigned price>
    Getraenkeautomat< price>::~Getraenkeautomat()
    {
    	cout << getraenk << " Getraenkeautomat wurde zerstört.\n";
    }
    #endif // GETRAENKEAUTOMAT_H_INCLUDED
    


  • Hier die Person Header Datei

    #ifndef PERSON_H_INCLUDED
    #define PERSON_H_INCLUDED
    #include <string>
    #include <iostream>
    using namespace std;
    struct Person
    {
    	Person(const string& n, double gth);
    	double guthaben;
    	string name;
    };
    
    Person::Person(const string& n, double gth) : name(n)
    {
    	cout << "Person namens " << name << " wurde erzeugt.\n";
    }
    
    #endif // PERSON_H_INCLUDED
    


  • Und "nicht dynamisch" lässt sich damit übersetzen?
    Wie sieht "dynamisch" aus?



  • Und wieso zeigst du nicht den Versuch das Objekt "dynamisch" zu erzeugen, d.h. die main.cpp?



  • Achsoo jetzt sehe ich den Fehler gefunden.
    Ich habe in der Getraenkeautomat Header Datei als letzten Parameter einen Zeiger auf die Person zurück geben(Konstruktor) müssen und keine Referenz das Problem hat sich nun erledigt.

    Jetzt muss ich die Klasse aber umschreiben da ich einige Fehler gemacht habe wie mir scheint.

    Danke für deine Hilfe 👍



  • So hab die Klasse nun vollständig das Ergebnis ist folgendes (für diejenigen denen es interessiert)

    Main.cpp

    #include "Person.h"
    #include "Getraenkeautomat.h"
    /* Programm muss noch beendet werden */
    
    int main(int argc, char* argv[])
    {
    	// Personen Objekt erzeugen
    	Person* NewPerson = new Person("Talon", 200);
    	// Getraenke Automat erzeugen
    	Getraenkeautomat<1> *NewAutomat = new Getraenkeautomat<1>("Fanta ", 20, NewPerson);
    
    	if (NewAutomat->getGetraenke() > 0)
    	{
    		while (!NewAutomat->isAviable())
    		{
    			if (NewAutomat->getGetraenke() > 0)
    			{
    				NewAutomat->print();
    				unsigned anzahl;
    				cin.tie(&cout);
    				cout << "\nWie viele Stücke wollen sie Kaufen?:";
    				cin >> anzahl;
    				NewAutomat->getraenkKaufen(anzahl);
    				cin.sync();
    				cin.clear();
    			}
    			else
    			{
    				cout << "\nGetraenke Automat ist Leer.";
    				cout << "\nProgramm wird beendet.!";
    				this_thread::sleep_for(chrono::seconds(10));
    			}
    		}
    	}
    	else
    	{
    		cout << "\nGetraenke Automat ist Leer.\n";
    		cout << "Programm wird beendet.!";
    		this_thread::sleep_for(chrono::seconds(10));
    	}
    
    	delete NewPerson; // Neue Person löschen
    	delete NewAutomat; // Getränke Automat löschen
    }
    

    Getraenkeautomat Header

    #ifndef GETRAENKEAUTOMAT_H_INCLUDED
    #define GETRAENKEAUTOMAT_H_INCLUDED
    #include <string>
    #include <thread>
    #include <chrono>
    #include <iostream>
    #include "Person.h"
    using namespace std;
    // Template function überdenken
    template<unsigned price>
    class Getraenkeautomat
    {
    public:
    	Getraenkeautomat(const string& gt, unsigned stk, Person* Pf);
    	Getraenkeautomat() : empty(true), preis(0), getraenk(""), ReferencePerson(nullptr) { }
    	void print() const;
    	void getraenkKaufen(unsigned);
    	~Getraenkeautomat();
    	const unsigned getGetraenke() const { return getraenkeanzahl; }
    	bool isAviable() const { return empty; }
    private:
    	int preis;
    	bool empty;
    	unsigned getraenkeanzahl;
    	string getraenk;
    	Person* ReferencePerson;
    };
    
    // Konstruktor der Klasse - Die Attribute mit Standartwerten initialisieren
    template<unsigned price>
    Getraenkeautomat< price>::Getraenkeautomat(const string& gt, unsigned stk,  Person* Pf)
    	: getraenk(gt), empty(false), getraenkeanzahl(stk), preis(price), ReferencePerson(Pf)
    {
    	cout << getraenk << " Getränkeautomat wurde aufgestellt." << endl;
    }
    
    // Person die dinge Kaufen wird mit übergeben
    template<unsigned price>
    void Getraenkeautomat<price>::print() const
    {
    	cout << "-----------------------------------------";
    	cout << "\nGetränk     :" << getraenk;
    	cout << "\nAnzahl Stück:" << getraenkeanzahl;
    	cout << "\nPreis für 1 :" << preis;
    	cout << "\n-----------------------------------------\n";
    }
    
    // Getränkeautomaten Klasse- void function
    template<unsigned price>
    void Getraenkeautomat<price>::getraenkKaufen(unsigned anz)
    {
    	if (getraenkeanzahl == 0)
    	{
    		empty = true;
    		cout << "\nGetränke Automat ist Leer.\n";
    		cout << "Programm wird beendet!\n";
    		this_thread::sleep_for(chrono::seconds(10));
    	}
    	else
    	{
    		if (anz > getraenkeanzahl)
    		{
    			cout << "\nZu große getränke Anzahl.\n" << endl;
    			cout << "Schleife wird neugestartet.\n" << endl;
    		}
    		else if (ReferencePerson->guthaben < (anz* preis))
    		{
    			cout << "\nNicht genug guthaben für den kauf von "
    				<< anz << " " << getraenk << "(s)\n" << endl;
    		}
    		else
    		{
    			ReferencePerson->guthaben -= price*anz;
    			getraenkeanzahl -= anz;
    			cout << endl <<  ReferencePerson->name << " hat erfolgreich " << anz
    				<< getraenk << "(e/r/s)" << " gekauft." << endl;
    		}
    	}
    }
    
    // Destruktor der Klasse- Konstrukt
    template<unsigned price>
    Getraenkeautomat< price>::~Getraenkeautomat()
    {
    	cout << getraenk << " Getraenkeautomat wurde zerstört.\n";
    }
    #endif // GETRAENKEAUTOMAT_H_INCLUDED
    

    Person Header

    #ifndef PERSON_H_INCLUDED
    #define PERSON_H_INCLUDED
    #include <string>
    #include <iostream>
    using namespace std;
    struct Person
    {
    	Person(const string& n, unsigned gth);
    	unsigned guthaben;
    	string name;
    };
    
    Person::Person(const string& n, unsigned gth) : name(n)
    {
    	cout << "Person namens " << name << " wurde erzeugt.\n";
    }
    
    #endif // PERSON_H_INCLUDED
    


  • Bleibt noch die Frage wieso du das Objekt überhaupt dynamisch erzeugen musstest und dann auch noch via rohem new und delete, was man in modernem C++ nicht machen sollte!
    Und da du ja schon this_thread verwendest, haste auch unique_ptr um es richtig zu machen. Wobei das dynamische hier sowieso überflüssig ist.



  • Ich wollte nur mal testen ob ich das Prinzip verstanden habe, deshalb habe ich eine dynamische Instanz verwendet^^



  • TemplateQ schrieb:

    Ich wollte nur mal testen ob ich das Prinzip verstanden habe, deshalb habe ich eine dynamische Instanz verwendet^^

    Gut dann teste das mal mit unique_ptr, denn wie schon gesagt, rohes new sollte man nicht verwenden.



  • 'unique_ptr' hatte ich bisher noch nicht 😕
    Das kommt erst in den nächsten Kapitel dran.
    Aber trotzdem kann ich mal einen blick darauf werfen.


Anmelden zum Antworten