Dziwne zachowanie programu
Ostatnio zmodyfikowano 2016-03-05 19:19
C-Objective |
» 2016-03-05 09:57:34 No to anarchia jak null zniknęło... Czemu użyłeś referencji przy tych tablicach? |
|
carlosmay |
» 2016-03-05 10:31:04 Czemu użyłeś referencji przy tych tablicach? |
Chyba jakaś chwila otępienia, a potem tego nie widziałem. Początkujący chyba tak mają |
|
|
Gage Temat założony przez niniejszego użytkownika |
» 2016-03-05 19:19:29 Wszystkie uwagi (wydaje mi się) wcieliłem w życie, program poprawiłem. Dodałem również operator=, new[], delete[], żeby zrobić zadanie "dla ambitnych": Zdefiniuj dla tej klasy także podobnie działające operatory new[] i delete[]. Mam wrażenie, że teraz wszystko jest w porządku i moje amatorskie testy sprawiają wrażenie, że wszystko działa bezbłędnie. Jeśli się mylę, albo ktoś ma jakieś techniczne uwagi - proszę o podzielenie się nimi. Klasę i funkcję zaprzyjaźnioną dla zainteresowanych wrzucam poniżej. #include <iostream> using namespace std;
class obiekty { static int wywolan; static int wywolan_tablic; string przedstawienie; static bool zarezerwowane[ 100 ]; static bool zarezerwowane_tablice[ 100 ]; public: static char * tablica[ 100 ]; static char * tablica_tablic[ 100 ]; static void * operator new( size_t ); static void operator delete( void * ); static void * operator new[]( size_t ); static void operator delete[]( void * ); string operator =( string ); obiekty( string dane = "Brak danych" ) : przedstawienie( dane ) { } static void wyzeruj_zarezerwowane(); friend ostream & operator <<( ostream &, obiekty & ); };
char * obiekty::tablica[ 100 ]; int obiekty::wywolan = 0; bool obiekty::zarezerwowane[ 100 ]; char * obiekty::tablica_tablic[ 100 ]; int obiekty::wywolan_tablic = 0; bool obiekty::zarezerwowane_tablice[ 100 ];
void obiekty::wyzeruj_zarezerwowane() { for( int i = 0; i < 100; i++ ) { zarezerwowane[ i ] = false; zarezerwowane_tablice[ i ] = false; } }
void * obiekty::operator new[]( size_t rozmiar ) { static int a; if( wywolan_tablic == 0 ) for( int i = 0; i < 100; i++ ) tablica_tablic[ i ] = new char[ rozmiar ]; if( wywolan_tablic < 100 ) { zarezerwowane_tablice[ wywolan_tablic ] = true; return tablica_tablic[ wywolan_tablic++ ]; } else if( wywolan_tablic >= 100 ) { int i; for( i = 0; i < 100; i++ ) { if( zarezerwowane_tablice[ i ] == false ) break; else if(( i == 99 ) &&( zarezerwowane_tablice[ i ] == true ) ) { cout << "Nie ma wiecej miejsca w tablicy tablic!!!" << endl; throw bad_alloc(); } } zarezerwowane_tablice[ i ] = true; return tablica_tablic[ i ]; } }
void obiekty::operator delete[]( void * roboczy ) { for( int i = 0; i < 100; i++ ) if( roboczy == tablica_tablic[ i ] ) { zarezerwowane_tablice[ i ] = false; } for( int i = 0; i < 100; i++ ) { if( zarezerwowane_tablice[ i ] == true ) { break; } else if(( i == 99 ) &&( zarezerwowane_tablice[ i ] == false ) ) { for( int p = 0; p < 100; p++ ) delete[] tablica_tablic[ p ]; } } }
void * obiekty::operator new( size_t rozmiar ) { if( wywolan == 0 ) for( int i = 0; i < 100; i++ ) tablica[ i ] = new char[ rozmiar ]; if( wywolan < 100 ) { zarezerwowane[ wywolan ] = true; return tablica[ wywolan++ ]; } else if( wywolan >= 100 ) { int i; for( i = 0; i < 100; i++ ) { if( zarezerwowane[ i ] == false ) break; else if( i == 99 ) { cout << "Nie ma wiecej miejsca!!!" << endl; throw bad_alloc(); } } zarezerwowane[ i ] = true; return tablica[ i ]; } }
void obiekty::operator delete( void * roboczy ) { for( int i = 0; i < 100; i++ ) if( roboczy == tablica[ i ] ) { zarezerwowane[ i ] = false; } for( int i = 0; i < 100; i++ ) { if( zarezerwowane[ i ] == true ) return; else if(( i == 99 ) &&( zarezerwowane[ i ] == false ) ) { for( int p = 0; p < 100; p++ ) delete[] tablica[ p ]; } } }
string obiekty::operator =( string dane ) { this->przedstawienie = dane; return dane; }
ostream & operator <<( ostream & ekran, obiekty & roboczy ) { ekran << "Nazywasz sie: " << roboczy.przedstawienie << endl; return ekran; }
|
|
1 « 2 » |