Witam. Mój problem polega na tym, że nie wyświetla mi pola składowego klasy. Krokowo wykonując program i podglądając moje zmienne wartość ginie gdzieś przy wykonywaniu cout<<this->nazwa. Ogólnie program polega na wczytaniu z pliku wartości do obiektu klasy. To wychodzi ładnie. Lecz przy wyświetlaniu nie wyświetla jednej składowej. Dodam jeszcze, że kiedy nie ładuje obiektów z klasy tylko tworze je po uruchomieniu programu (przez odpowiednie funkcje) i potem wyświetlam liste wszystko jest ok. Niże zamieszczam moje pliki.
main
#include <iostream>
#include <string>
#include "Produkt.h"
#include "Lista.h"
using namespace std;
int main()
{
char z;
Produkt *nowy;
Lista produkty;
while(1)
{
nowy = new Produkt("",0,0,0);
system("CLS");
cout<<"n - Nowy Produkt"<<endl<<"u - Usun Produkta"<<endl<<"w - Wypisz liste Produktow"<<endl<<"s - Znajdz Produkt"<<endl
<<"o - Wczytaj baze danych"<<endl<<"z - Zapisz do bazy danych"<<endl;
cin>>z;
system("CLS");
switch(z)
{
case 'n': nowy->Wpisz();
produkty.Dodaj(*nowy);
break;
case 'w': produkty.WypiszListe();
system("PAUSE");
break;
case 'u': nowy->Wpisz();
produkty.Usun(*nowy);
break;
case 's': {
string nazwa;
cout<<"Podaj nazwe: ";
cin>>nazwa;
produkty.Szukaj(nazwa);
system("PAUSE");
break;
}
case 'o': produkty.OdczytajListe(produkty);
break;
case 'z': produkty.ZapiszDoPliku();
system("PAUSE");
break;
case 'q': exit(0);
break;
}
}
system("PAUSE");
return 0;
}
Lista.cpp
#include "Lista.h"
Lista::Lista(void)
{
liczbaProduktow = 0;
pierwszy=NULL;
ostatni=NULL;
}
Lista::Lista(const Lista &wzor)
{
}
Lista::~Lista(void)
{
}
void Lista::Dodaj(const Produkt &p)
{
Produkt *nowy = new Produkt(p);
if(liczbaProduktow==0)
{
pierwszy=ostatni=nowy;
pierwszy->nastepny=NULL;
liczbaProduktow++;
}
else
{
Produkt *iter = pierwszy;
Produkt *poprzedni = pierwszy;
liczbaProduktow++;
while(iter!=false)
{
if(nowy->Porownaj(*iter)<=0)
{
nowy->nastepny = iter;
if(pierwszy==iter)
pierwszy=nowy;
else poprzedni->nastepny=nowy;
break;
}
if(iter->nastepny==false)
{
iter->nastepny=nowy;
ostatni = nowy;
ostatni->nastepny=NULL;
break;
}
else
{
poprzedni = iter;
iter = iter->nastepny;
}
}
}
}
void Lista::Usun(const Produkt &wzorzec)
{
if(pierwszy)
{
Produkt *nastepny;
Produkt *poprzedni=NULL;
Produkt *iter=pierwszy;
while(iter!=false)
{
if(wzorzec==*iter)
{
if(wzorzec==*pierwszy)
{
pierwszy = iter->nastepny;
delete iter;
if(liczbaProduktow==0) delete ostatni;
}
else
{
poprzedni->nastepny=iter->nastepny;
if(wzorzec.Porownaj(*ostatni)==0) ostatni=poprzedni;
delete iter;
}
liczbaProduktow--;
break;
}
else if(wzorzec.Porownaj(*iter)>0)
{
if(iter->nastepny==false)
{
cout<<"Nie znaleziono Produkta o podanych danych"<<endl;
break;
}
else
{
poprzedni = iter;
iter = iter->nastepny;
}
}
else if(wzorzec.Porownaj(*iter)<0)
{
cout<<"Nie znaleziono Produkta o podanych danych"<<endl;
break;
}
}
}
}
void Lista::WypiszListe() const
{
if(liczbaProduktow!=0)
{
Produkt *iter = pierwszy;
while(iter!=NULL)
{
iter->Nazwa();
iter->Wypisz();
//cout<<iter;
iter=iter->nastepny;
}
}
else cout<<"Lista produktow jest pusta!"<<endl;
}
const Produkt *Lista::Szukaj(const string nazwa) const
{
Produkt *iter = pierwszy;
while(iter!=NULL)
{
if((iter->Nazwa()==nazwa)) return iter;
iter = iter->nastepny;
}
return NULL;
}
void Lista::ZapiszDoPliku()
{
if(liczbaProduktow!=0)
{
fstream plik;
Produkt *iter = pierwszy;
plik.open("bazaProduktow.txt", ios::out);
if(plik.good())
{
while(iter!=NULL)
{
if(iter->nastepny==NULL) plik<<iter->Kod()<<endl<<iter->Nazwa()<<endl<<iter->Cena()<<endl<<iter->Ilosc();
else plik<<iter->Kod()<<endl<<iter->Nazwa()<<endl<<iter->Cena()<<endl<<iter->Ilosc()<<endl;
iter=iter->nastepny;
}
}
else cout<<"Nie mozna otworzyc bazy danych"<<endl;
plik.close();
}
else cout<<"Lista Produktow jest pusta"<<endl;
}
void Lista::OdczytajListe(Lista &produkty)
{
Produkt *nowy;
fstream plik;
int i;
plik.open("bazaProduktow.txt", ios::in | ios::binary);
if(plik.good())
{
while(!plik.eof())
{
nowy = new Produkt("",0,0,0);
string nazwa,kod,cena,ilosc;
getline(plik,kod);
getline(plik,nazwa);
getline(plik,cena);
getline(plik,ilosc);
int kodPo = atof(kod.c_str());
float cenaPo = atof(cena.c_str());
float iloscPo = atof(ilosc.c_str());
nowy->Nazwa(nazwa);
nowy->Kod(kodPo);
nowy->Cena(cenaPo);
nowy->Ilosc(iloscPo);
produkty.Dodaj(*nowy);
}
}
else cout<<"Nie mozna otworzyc bazy produktow."<<endl;
}
Lista.h
#ifndef LISTA_H
#define LISTA_H
#include <iostream>
#include <fstream>
#include "Produkt.h"
using namespace std;
class Lista
{
private:
Produkt* pierwszy;
Produkt* ostatni;
int liczbaProduktow;
public:
Lista(void);
Lista::Lista(const Lista &wzor);
~Lista(void);
void Dodaj(const Produkt &p);
void Usun(const Produkt &wzorzec);
void WypiszListe() const;
const Produkt *Szukaj(const string nazwa) const;
void ZapiszDoPliku();
void OdczytajListe(Lista &produkty);
};
#endif
Produkt.cpp
#include <iostream>
#include <stdio.h>
#include "Produkt.h"
using namespace std;
Produkt::Produkt(void){}
Produkt::Produkt(const string nazwa, const int kod, const float cena,const float ilosc)
{
this->nazwa = nazwa;
this->kod = kod;
this->cena = cena;
this->ilosc = ilosc;
this->nastepny = NULL;
}
Produkt::Produkt(const Produkt &wzor)
{
this->nazwa = wzor.nazwa;
this->kod = wzor.kod;
this->cena = wzor.cena;
this->ilosc = wzor.ilosc;
nastepny = wzor.nastepny;
}
Produkt::~Produkt(void)
{
}
const string Produkt::Nazwa() const
{
return this->nazwa;
}
const int Produkt::Kod() const
{
return this->kod;
}
const float Produkt::Cena() const
{
return this->cena;
}
const float Produkt::Ilosc() const
{
return this->ilosc;
}
void Produkt::Nazwa(string nazwa)
{
this->nazwa=nazwa;
}
void Produkt::Kod(int kod)
{
this->kod=kod;
}
void Produkt::Cena(float cena)
{
this->cena=cena;
}
void Produkt::Ilosc(float ilosc)
{
this->ilosc=ilosc;
}
void Produkt::Wpisz()
{
cout<<"Podaj nazwe: ";
cin>>this->nazwa;
cout<<"Podaj kod: ";
cin>>this->kod;
cout<<"Podaj cene: ";
cin>>this->cena;
cout<<"Podaj ilosc: ";
cin>>this->ilosc;
}
void Produkt::Wypisz()
{
cout<<this->nazwa<<" "<<this->kod<<" "<<this->cena<<" "<<this->ilosc<<endl;
}
int Produkt::Porownaj(const Produkt& wzorzec) const
{
return Nazwa().compare(wzorzec.Nazwa());
}
Produkt &Produkt::operator=(const Produkt &wzor)
{
this->nazwa = wzor.nazwa;
this->kod = wzor.kod;
this->cena = wzor.cena;
this->ilosc = wzor.ilosc;
nastepny = wzor.nastepny;
return *this;
}
bool Produkt::operator==(const Produkt &wzor) const
{
if((this->nazwa==wzor.nazwa)&&(this->kod==wzor.kod)&&(this->cena==wzor.cena)) return true;
else return false;
}
ostream &operator<<(ostream &wy,const Produkt &p)
{
return wy<<p.nazwa<<" "<<p.kod<<" "<<p.cena<<" "<<p.ilosc;
}
Produkt.h
#ifndef PRODUKT_H
#define PRODUKT_H
#include <iostream>
#include <string>
using namespace std;
class Produkt
{
private:
string nazwa;
int kod;
float cena;
float ilosc;
public:
Produkt* nastepny;
Produkt(void);
Produkt(const string nazwa = "", const int kod=0, const float cena=0,const float ilosc=0);
Produkt(const Produkt &wzor);
~Produkt(void);
const string Nazwa() const;
const int Kod() const;
const float Cena() const;
const float Ilosc() const;
void Nazwa(string nazwa);
void Kod(int kod);
void Cena(float cena);
void Ilosc(float ilosc);
void Wypisz();
void Wpisz();
int Porownaj(const Produkt& wzorzec) const;
Produkt &operator=(const Produkt &wzor);
bool operator==(const Produkt &wzor) const;
friend ostream &operator<<(ostream &wy,const Produkt &p);
};
#endif
bazaProduktow.txt
123454
Arbuz
12.5
9
987654
Jogurt
1.45
90
123456
Monte
3.4
30
123098
czekolada
3.19
90
Czyli kiedy odczytuje wartości z pliku i tworzę listę produktów, a następnie wykonuje funkcję wypiszListe() to nie wyświetla nazwy. Jednak jesli załaduje listę z pliku i dodam jeszcze jakiś produkt, a następnie wywołam znowu funkcję wypiszListeZatrudnionych() to widoczna jest nazwa tylko tego jednego obiektu nowo dodanego. Proszę o pomoc. Mam to na jutro. Z góry dzięki za starania.