Witam!
Miałem zrobić takie ćwiczenie pod koniec działu o przeładowanych operatorach:
Prosty program, ale odnośnie jednej rzeczy mam pytanie. Kiedy przekroczymy rezerwację, tzn. wykorzystaliśmy już 100 obiektów to teraz nie pozostaje nic innego niż ustawienie składnika statycznego ktory_raz na 0. I tutaj jest właśnie wg mnie minus tego programu - jeżeli pierwszy wskaźnik miał nazwę wektor_sily, potem w programie wykorzystaliśmy te 100 obiektów i zaczynamy od zera to teraz jak zdefiniujemy wskaźnik predkosc i będziemy chcieli usunąć delet’em - albo 1-szy albo 2-gi - to tylko jeden. Usunięcie jednego spowoduje usunięcie drugiego. Tego minusu nie da się chyba naprawić.
A odnośnie programu to powiedzcie co można było by w nim zmienić.
#include
using namespace std;
//////////////////////////////////////////////////
class wektor
{
int x, y;
static int *wsk[100];
static int ktory_raz;
public:
//------------konstruktor
wektor(int a = 0, int b = 0) : x(a), y(b)
{ }
//###################################################
//############# PRZEŁADOWANE OPERATORY ##############
//---------------------------------------------------
//---------------------------------------------------
static void* operator new(size_t rozmiar)
{
if(ktory_raz == 0)
{
for(int i = 0; i < 100 ; i++)
{
wsk[i] = new int[rozmiar];
}
return wsk[ktory_raz++];
}
else
{
if(ktory_raz == 100) //jeżeli zapełniliśmy całą tablicę wskaźników
{ //to zaczynamy od początku (ktory_raz = 0)
//odbędzie się nadpisanie !
ktory_raz = 0;
}
return wsk[ktory_raz++];
}
}
//---------------------------------------------------
//---------------------------------------------------
static void operator delete(void *do_skasowania)
{
if(ktory_raz == 100)
{
for(int i = 0 ; i < 100 ; i++) //jeżeli ktory_raz jest równy 100
delete wsk[i]; //to zwalniamy całą rezerwację
}
else
{
int ktory_numer;
for(int i = 0 ; i <= 100 ; i++)
{
ktory_numer = i;
if(wsk[i] == do_skasowania) //musimy wyszukać w naszej rezerwacji adres
{ //obiektu na rzecz, którego chcemy wykonać
break; //zwolnienia pamięci
}
}
delete wsk[ktory_numer];
}
}
//---------------------------------------------------
//---------------------------------------------------
};
//////////////////////////////////////////////////
int* wektor::wsk[100]; //definicje obiektów statycznych klasy 'wektor'
int wektor::ktory_raz;
int main()
{
wektor* wektor_sily; //ktory_raz = 0
wektor_sily = new wektor;
wektor* wektor_predkosci; //ktory_raz = 1
wektor_predkosci = new wektor;
wektor* tabl[98]; //ktory_raz = 99
for(int i = 0 ; i < 98 ; i++)
{
tabl[i] = new wektor;
}
//ktory_raz wynosi: 100
wektor* predkosc = new wektor;
//ktory_raz wynosi: 1
delete wektor_sily; //i teraz się skasuje wsk[0]
//delete predkosc; <----- no i teraz byłby błąd - o tym mówiłem właśnie
}
Z góry jak zwykle - dziękuję za pomocne rady.