Singleton



  • Moin moin

    http://imgh.us/Unbenannt_25.jpg

    also ich habe eine Frage,wie man die Klasse Verwaltung durch Singleton implementieren kann.

    ich habe auch keine Ahnung,warum die Aufgabe so ist.
    ich kann nur die Aufgabe ohne Singleton programmieren.

    konnt ihr mir erklären,wie ich es implementieren kann?

    ich werde mich auf eure Antwort freuen.



  • Was willst du denn jetzt wissen?
    Google nach "c++ singleton" hat nicht geholfen!?



  • #pragma once
    #include "Konto.h"
    #include "FirmenGiroKonto.h"
    #include "PrivatGiroKonto.h"
    #include "Transaktion.h"
    #include <string>
    #include <fstream>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    class Verwaltung
    {
    public:
    	Verwaltung();
    	~Verwaltung();
    	void kontoauflisten();
    	void makeFirmengirokonto(string,string);
    	void makePrivatgirokonto(string,string);
    	int getKonto(string);
    	vector<Konto*>konten;
    	void transaktion_suchen(string);
    private:
    	Konto *newKonto;
    	Transaktion *newTransaktion;
    };
    
    #include "stdafx.h"
    #include "Verwaltung.h"
    #include <string>
    Verwaltung::Verwaltung()
    
    {
    	ifstream myFile1("Konto.txt", ios::in);
    	ifstream myFile2("Transaktion.txt", ios::in);
    
    	if (myFile1 && myFile2)
    	{
    		string reader = "" ; int counter = 0;
    
    		while (getline(myFile1, reader, ';'))
    		{
    			if (counter == 0)
    			{
    				if (reader == "Privat")
    				{
    					newKonto = new PrivatGiroKonto;
    					newKonto->type = reader;
    				}
    				if (reader == "Firma")
    				{
    					newKonto = new FirmenGiroKonto;
    					newKonto->type = reader;
    				}
    			}
    			if (counter == 1)
    				newKonto->setKontonummer(reader);
    			if (counter == 2)
    				newKonto->setKontostand(stof(reader));
    			counter++;
    			if (counter == 3)
    			{
    				konten.push_back(newKonto);
    				counter = 0;
    			}
    
    		}
    	///////////////////////////////////////////////////////////////////////////
    		reader = ""; counter = 0; int index; newTransaktion = new Transaktion;
    		while (getline(myFile2, reader, ';'))
    		{
    			if (counter == 0)
    			{
    				for (unsigned int i = 0; i < konten.size(); i++)
    				{
    					if (konten[i]->getKontonummer() == reader)
    					{
    						index = i;
    					}
    				}
    			}
    			if (counter == 1)
    				newTransaktion->id = reader;
    			if (counter == 2)
    				newTransaktion->zeitpunkt = reader;
    			if (counter == 3)
    				newTransaktion->betrag = stof(reader);
    
    			counter++;
    
    			if (counter == 4){
    				counter = 0;
    				konten[index]->getTransaktionen().push_back(newTransaktion);
    				konten[index]->transaktionDurchfuehren(newTransaktion);
    				newTransaktion = new Transaktion;
    			}
    
    		}
    	}
    }
    
    Verwaltung::~Verwaltung()
    {
    	////////////////
    	//cout << "Destructor called " << endl;
    	//system("pause");
    	ofstream myFile1("Konto.txt", ios::out);
    	ofstream myFile2("Transaktion.txt", ios::out);
    
    		for (unsigned int i = 0; i < konten.size(); i++)
    		{
    			myFile1 << konten[i]->type << ";" << konten[i]->getKontonummer() << ";" << konten[i]->getKontostand() << ";";
    			myFile2 << konten[i]->getKontonummer() << ";";
    			for (unsigned int j = 0; j < konten[i]->getTransaktionen().size(); j++)
    			{
    				myFile2  <<konten[i]->getTransaktionen()[j]->id << ";" << konten[i]->getTransaktionen()[j]->zeitpunkt << ";" << konten[i]->getTransaktionen()[j]->betrag << ";";
    				if(j < konten[i]->getTransaktionen().size()-1)
    					myFile2 << konten[i]->getKontonummer() << ";";
    			}
    		}
    	delete newKonto;
    }
    
    void Verwaltung::kontoauflisten()
    {
    	if(konten.size() != 0)
    	{
    		for (unsigned int i = 0; i < konten.size(); i++)
    		{
    			cout << i + 1 << " -> " << konten[i]->getKontonummer() << " -> " << konten[i]->getKontostand() << endl;
    			for (unsigned int j = 0; j < konten[i]->getTransaktionen().size(); j++)
    			{
    				cout << "--> ID : " << konten[i]->getTransaktionen()[j]->id << " Date :" << konten[i]->getTransaktionen()[j]->zeitpunkt << " Betrag: " << konten[i]->getTransaktionen()[j]->betrag << endl;
    			}
    		}
    	}
    	else
    		cout << "Es gibt kein gespeicherte Konto !" << endl;
    }
    
    void Verwaltung::makeFirmengirokonto(string newNummer,string Type)
    {
    	Konto *newKonto = new FirmenGiroKonto;
    	newKonto->setKontonummer(newNummer);
    	newKonto->type = Type;
    	konten.push_back(newKonto);
    }
    
    void Verwaltung::makePrivatgirokonto(string newNummer,string Type)
    {
    	Konto *newKonto = new PrivatGiroKonto;
    	newKonto->setKontonummer(newNummer);
    	newKonto->type = Type;
    	konten.push_back(newKonto);
    }
    
    int Verwaltung::getKonto(string Kontonummer)
    {
    	for (unsigned int i = 0; i < konten.size(); i++)
    	{
    		if (konten[i]->getKontonummer() == Kontonummer)
    			return i;
    	}
    
    }
    
    void Verwaltung::transaktion_suchen(string t_id)
    {
    	if (konten.size() != 0)
    	{
    		for (unsigned int i = 0; i < konten.size(); i++)
    		{
    			for (unsigned int j = 0; j < konten[i]->getTransaktionen().size(); j++)
    			{
    				if(t_id == konten[i]->getTransaktionen()[j]->id)
    					cout <<	 konten[i]->getTransaktionen()[j]->id << " Date :" << konten[i]->getTransaktionen()[j]->zeitpunkt << " Betrag: " << konten[i]->getTransaktionen()[j]->betrag << endl;
    			}
    		}
    	}
    	else
    		cout << "Es gibt kein gespeicherte Konto !" << endl;
    }
    

    ich habe einfach nur keine Idee ,wie man diese durch Singleton implementieren kann.



  • Das ist doch völlig wurscht, was das jetzt konkret für eine Klasse ist.

    https://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Entwurfsmuster:_Singleton

    N durch Verwaltung ersetzen.



  • Jockelx schrieb:

    Das ist doch völlig wurscht, was das jetzt konkret für eine Klasse ist.

    https://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Entwurfsmuster:_Singleton

    N durch Verwaltung ersetzen.

    aha danke dir. jetzt verstehe ich.



  • Was anderes: Du hast in deinem Code Memory Leaks.
    Du rufst in Whileschleifen new() auf. Also wahrscheinlich häufiger. Aber du gibst immer nur einmal den Speicher wieder frei.



  • Schlangenmensch schrieb:

    Was anderes: Du hast in deinem Code Memory Leaks.
    Du rufst in Whileschleifen new() auf. Also wahrscheinlich häufiger. Aber du gibst immer nur einmal den Speicher wieder frei.

    aha danke dir für die Erinerrung, das habe ich vergessen.
    😃



  • Und was passiert, wenn die Dateien nicht geöffnet/gelesen werden können?



  • Hi schrieb:

    Und was passiert, wenn die Dateien nicht geöffnet/gelesen werden können?

    kein Konto wird importiert, hmmm ich habe nicht verstehen.
    habe ich etwas falsch gemacht beim Importieren?



  • Ich weiß, es steht in der Aufgabe, aber floats sind nicht geeignet für die Verwaltung von Geld.
    Beispiel:

    int64_t i = 200023426; // Betrag in Cent
    	float f=i/100.f;
    	for(int k=0;k<10000;++k) // Transaktionen
    	{
    		int r = rand()%1000000;
    		if(r&1)
    			r=-r;
    		i+=r;
    		f+=r/100.f;
    	}
    	std::cout << f << " : " << i << std::endl;
    


  • moneymaker schrieb:

    Ich weiß, es steht in der Aufgabe, aber floats sind nicht geeignet für die Verwaltung von Geld.
    Beispiel:

    int64_t i = 200023426; // Betrag in Cent
    	float f=i/100.f;
    	for(int k=0;k<10000;++k) // Transaktionen
    	{
    		int r = rand()%1000000;
    		if(r&1)
    			r=-r;
    		i+=r;
    		f+=r/100.f;
    	}
    	std::cout << f << " : " << i << std::endl;
    

    aha ja genau diese Typ ist nicht geeignet, aber in der Aufgabe steht so, das ist eine Probeklausur.



  • ich habe noch Frage, ob es memory leaks gibt oder nicht

    #pragma once
    #include "Verwaltung.h"
    #include "Transaktion.h"
    #include <string>
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    class Menue
    {
    public:
    	Menue();
    	virtual ~Menue();
    	void main_menu();
    	void konto_anlegen();
    	void konto_auflisten();
    	void transaktion_durchfuehren();
    	void transaktion_suchen();
    private:
    	Verwaltung myVerwaltung;
    	Transaktion *newTransaktion;
    
    };
    
    #include "stdafx.h"
    #include "Menue.h"
    #include "TransaktionsGenerator.h"
    void Menue::konto_anlegen()
    {
    	cout << "----- Konto anlegen ----- " << endl;
    	cout << "1 - Firmengirokonto " << endl;
    	cout << "2 - Privatgirokonto " << endl;
    	cout << "Eingabe : ";
    	int eingabe; cin >> eingabe;
    	cout << "Kontonummer : ";
    	string kontonummer; cin >> kontonummer;
    	string type;
    	if (eingabe == 1)
    	{
    		type = "Firma";
    		myVerwaltung.makePrivatgirokonto(kontonummer,type);
    	}
    	if (eingabe == 2)
    	{
    		type = "Privat";
    		myVerwaltung.makeFirmengirokonto(kontonummer,type);
    	}
    }
    
    void Menue::konto_auflisten()
    {
    	myVerwaltung.kontoauflisten();
    }
    
    void Menue::transaktion_durchfuehren()
    {
    	cout << "----- Transaktion durchfuehren ----- " << endl;
    	cout << "Kontonummer : ";
    	string kontonummer; cin >> kontonummer;
    	cout << "Betrag : ";
    	float betrag; cin >> betrag;
    	cout << "Zeitpunkt : ";
    	string zeitpunkt; cin >> zeitpunkt;
    	newTransaktion = new Transaktion;
    	newTransaktion->betrag = betrag;
    	newTransaktion->zeitpunkt = zeitpunkt;
    	newTransaktion->id = TransaktionsGenerator::generateID();
    	int index; index = myVerwaltung.getKonto(kontonummer);
    	myVerwaltung.konten[index]->transaktionDurchfuehren(newTransaktion);
    	if (myVerwaltung.konten[index]->type == "Firma") // Aufgabe 2
    	{
    		if (betrag <= 5)
    			betrag = betrag - 0.10;
    		if (betrag > 5)
    			betrag = betrag - (betrag * 0.02);
    		myVerwaltung.konten[index]->setKontostand(myVerwaltung.konten[index]->getKontostand() + betrag);
    
    	}else
    		myVerwaltung.konten[index]->setKontostand(myVerwaltung.konten[index]->getKontostand() + betrag);
    }
    
    Menue::Menue()
    {
    }
    
    void Menue::main_menu()
    {
    
    	int eingabe;
    	do {
    	cout << "----- Main Menue -----" << endl;
    	cout << "1. Konto anzeigen " << endl;
    	cout << "2. Konto anlegen " << endl;
    	cout << "3. Transaktion durchfuehren " << endl;
    	cout << "4. Transaktion ID suchen" << endl;
    	cout << "5. Exit " << endl;
    	cout << "Eingabe : ";
    	cin >> eingabe;
    
    	if (eingabe == 1)
    		konto_auflisten();
    	if (eingabe == 2)
    		konto_anlegen();
    	if (eingabe == 3)
    		transaktion_durchfuehren();
    	if (eingabe == 4)
    		transaktion_suchen();
    	if (eingabe == 5)
    		break;
    	else
    		return main_menu();
    	} while (eingabe != 4);
    }
    
    void Menue::transaktion_suchen() {
    	cout << "Transaktion ID : ";
    	string trans; cin >> trans;
    	myVerwaltung.transaktion_suchen(trans);
    }
    
    Menue::~Menue()
    {
    	delete newTransaktion;
    }
    


  • Ja, gibt es und zwar, wenn du mehrere Transaktionen durchführst.

    Warum ist 'newTransaktion' überhaupt ein Member der Klasse und nicht einfach eine lokale Variable? Und benötigt 'transaktionDurchfuehren' wirklich einen mittels new erzeugten Speicherbereich als Parameter?



  • Th69 schrieb:

    Ja, gibt es und zwar, wenn du mehrere Transaktionen durchführst.

    Warum ist 'newTransaktion' überhaupt ein Member der Klasse und nicht einfach eine lokale Variable? Und benötigt 'transaktionDurchfuehren' wirklich einen mittels new erzeugten Speicherbereich als Parameter?

    kann ich so machen ?
    delete newTransaktion;
    newTransaktion = NULL;

    also wäre es besser, wenn ich newTransaktion als lokale Variable dekralieren?



  • Wenn du newTransaktion nur in Menue::transaktion_durchfuehren() benötigst solltest du du newTransaktion auch da lokal anlegen.
    Stellt sich noch die Frage warum du das überhaupt mit new() auf dem Heap haben möchtest und du das nicht einfach lokal als variable definierst mit

    newTransaktion transaktion;
    

Log in to reply