Znalazłem błąd... To znaczy w metodzie pojemnik::dodaj
Lepiej zrobić tak:
double pojemnik::dodaj(double ile)
{
double roznica = 0;
zajete += ile;
if(zajete > max)
{
roznica = zajete - max;
zajete = max;
}
throw(blad(max,zajete,roznica));
return roznica;
}
niż
if(zajete > max)
{
roznica = zajete - max;
zajete = max;
throw(blad(max,zajete,roznica));
}
Prościej będzie "jechać" pętlą po wektorze i wypełniać/dopełniać kolejne pojemniki.
Hmmm... może masz rację. Ale zrobiłem tak:
void multipojemnik::dolej(double ile)
{
while(ile!=0.0)
{
cout << "ILE = " << ile << endl;
if(ile > 0)
{
if(tablica.size() == 0)
{
cout << "\tmsg: wektor jest pusty tablica.size() == 0\n\tmsg: tworze obiekt i wrzucam go do wektora\n";
pojemnik a = pojemnik(15, 0);
cout << "\tmsg: tworze obiekt; jego pole max=" << a.max << " jego pole zajete=" << a.zajete << endl;
tablica.push_back(a);
cout << "\tmsg: dodaje do pierwszego elementu tablicy wartosc " << ile << endl;
try
{
(tablica.back()).dodaj(ile);
}
catch(blad e)
{
ile = e.roznica;
}
}
else if( (tablica.size() > 0) && (tablica.size() < multi_max))
{
cout << "\tmsg: wektor ma " << tablica.size() << " pozycji\n";
if( (tablica.back()).zajete < (tablica.back()).max )
{
cout << "\tmsg: pole zajete jest mniejsze od max (w ostatnim elemencie jest miejsce); probuje dodac do ostatniej pozycji wektora " << ile << endl;
try
{
(tablica.back()).dodaj(ile);
}
catch (blad e)
{
ile = e.roznica;
}
}
else
{
cout << "\tmsg: ostatnia pozycja w tablicy jest pelna;\n";
pojemnik b = pojemnik(tablica.back());
cout << "\tmsg: tworze obiekt; jego pole max=" << b.max << " jego pole zajete=" << b.zajete << endl;
cout << "\tmsg: i wrzucam do tablicy na ostatnia pozycje\n";
tablica.push_back(b);
cout << "\tmsg: dodaje do nowego obiektu " << ile << endl;
try
{
(tablica.back()).dodaj(ile);
}
catch (blad e)
{
ile = e.roznica;
}
}
}
else
{
blad2 f = blad2(ile);
throw(f);
}
}
}
}
Apropos realokacji: wektor działa w taki a nie inny sposób, że czasami musi skopiować obiekty w inne miejsce pamięci, i wtedy korzysta z ww. konstruktora. A Twój nie robi kopii tylko bliżej nieokreślone coś, przez co po pewnym czasie masz w wektorze nie to co do niego wkładałeś.
Rozumiem.. W takim razie, jak zrobić obiekt z polem zajete równym 0 na bazie ostatniego elementu w wektorze?
Apropos utrudniania analizy: mieszanie co chwila wypisywanych rzeczy na ekran z tym, co tak na prawdę sprawia że program działa pogarsza czytelność. Może wybrzydzam, ale to się trudno czyta.
Oczywiście masz rację. Generalnie do klas i metod nie wrzucam wypisywania żadnego. Tutaj zrobiłem wyjątek tylko ze względu na grzebanie w kodzie i chęć dowiedzenia się, jak to leci i gdzie się wysypuje.