Witam.
Uczę się programowania obiektowego i postanowiłem napisać prostą bazę danych w tym wypadku klientów banku z użyciem klasy. Problem polega na tym że funkcja odczytująca z pliku powiela ostatni obiekt i w rezultacie powstaje coś takiego
Tak wygląda przed ponownym uruchomieniem programu: http://www.tinypic.pl/ofl3bcqw57p0
a tak po: http://www.tinypic.pl/iv5oyqjz2sfs
Kod źródłowy
plik klient.h
#include<iostream>
using namespace std;
class Klient
{
private:
double stanKonta;
string imie;
string nazwisko;
int numerID;
public:
static int ileKlientow;
Klient(int id, string name, string surname, double stan = 0);
Klient(){};
void dodaj_srodkow (double ile);
void odejmij_srodkow (double ile);
void wyczysc_konto();
int ID();
double ile_srodkow();
string Imie();
string Nazwisko();
~Klient();
};
plik klient.cpp
#include "klient.h"
using namespace std;
int Klient::ileKlientow = 0; //licznik obiektów
//--------------------------
//konstruktor
Klient::Klient(int id, string name, string surname, double stan): numerID(id), imie(name), nazwisko(surname), stanKonta(stan)
{
ileKlientow++;
}
//--------------------------
//destruktor
Klient::~Klient()
{
ileKlientow--;
}
//---------------------------
void Klient::dodaj_srodkow(double ile)
{
stanKonta += ile;
}
//---------------------------
void Klient::odejmij_srodkow(double ile)
{
stanKonta -=ile;
}
//---------------------------
void Klient::wyczysc_konto()
{
stanKonta = 0;
}
//---------------------------
int Klient::ID()
{
return numerID;
}
string Klient::Imie()
{
return imie;
}
string Klient::Nazwisko()
{
return nazwisko;
}
double Klient::ile_srodkow()
{
return stanKonta;
}
///////////////////////////////
plik main.cpp
#include "klient.h"
#include<iostream>
#include<sstream>
#include<fstream>
#include<conio.h>
using namespace std;
Klient *klient[200];
int id = 0;
double string_na_double(string tekst)
{
istringstream strumien(tekst);
double liczba;
strumien>>liczba;
return liczba;
}
int string_na_int(string tekst)
{
istringstream strumien(tekst);
int z;
strumien>>z;
return z;
}
char wyswietl_menu()
{
system("cls");
cout<<" Liczba klientow: "<<Klient::ileKlientow<<endl;
cout<<"1 - Dodaj nowego klienta\n";
cout<<"2 - Usun klienta\n";
cout<<"3 - Wyswietl wszystkich klientow\n";
cout<<"4 - Wyszukaj klienta\n";
cout<<"0 - Koniec\n";
return getch();
}
void odczyt()
{
int ID;
string im;
string na;
double st;
ifstream odczyt;
odczyt.open("dane.txt");
if(odczyt.good())
{
while(!odczyt.eof())
{
string liczba;
getline(odczyt, liczba, '$');
ID = string_na_int(liczba);
getline(odczyt, im, '$');
getline(odczyt, na, '$');
getline(odczyt, liczba, '\n');
st = string_na_double(liczba);
klient[Klient::ileKlientow] = new Klient(ID, im, na, st);
}
}
odczyt.close();
}
void zapisz()
{
ofstream zapis;
zapis.open("dane.txt", ios::out);
for(int i = 0; i<Klient::ileKlientow; i++)
{
zapis<<klient[i]->ID()<<"$"<<klient[i]->Imie()<<"$"<<klient[i]->Nazwisko()<<"$"<<klient[i]->ile_srodkow()<<"\n";
}
zapis.close();
}
void dodaj_klienta()
{
system("cls");
string imie, nazwisko;
cout<<"Podaj imie klienta: ";
cin>>imie;
cout<<"\nPodaj nazwisko klienta: ";
cin>>nazwisko;
klient[Klient::ileKlientow] = new Klient(id, imie, nazwisko);
id++;
zapisz();
}
void wypisz()
{
system("cls");
for(int i = 0; i<Klient::ileKlientow; i++)
{
cout<<"ID: "<<klient[i]->ID()<<endl;
cout<<"Imie: "<<klient[i]->Imie()<<endl;
cout<<"Nazwisko: "<<klient[i]->Nazwisko()<<endl;
cout<<"Stan konta: "<<klient[i]->ile_srodkow()<<endl;
cout<<"----------------------------------------------\n";
}
system("pause");
}
int main()
{
bool koniec = false;
odczyt();
do
{
switch(wyswietl_menu())
{
case '1': dodaj_klienta(); break;
case '2': cout<<"opcja 2"; break;
case '3': wypisz(); break;
case '4': cout<<"opcja 4"; break;
case '0': koniec = true; break;
}
}
while(!koniec);
return 0;
}
Oczywiście ten program jeszcze nie jest skończony, ale najpierw chcę zrobić sprawne zapisywanie, odczytywanie i dodawanie nowych obiektów, dopiero wtedy mogę się zabierać za pozostałe rzeczy.