maze Temat założony przez niniejszego użytkownika |
Problem z tablica przy wywolywaniu funkcji klasy. » 2013-03-10 18:37:17 Witam, jestem na etapie nauki wykorzystania klas, i mam pewien problem przy programie ktory napisalem i nie moge zlokalizowac bledu. Raczej nie jest to skomplikowana sprawa ale nie moge wpasc na to co jest nie tak. Tym bardziej ze wczesniej dzialal mi ta funkcja, i nie potrafie dojsc jaka zmiane wprowadzilem, przez ktora przestala dzialac. Mam jedna klase, ktora zarzadza tablica liczb, mam w niej kilka funkcji takich jak "wyswietl" "wyzeruj" "posortuj"; Program sie kompiluje, moge dodac nowa tablice, ale kiedy chce ja wyswietlic lub posortowac debugger wywala mi sie w miejscu petli, w ktorej jest dostep do tej tablicy. Do obiektow klasy jest dostep poprzez tablice wskaznikow do nich, kiedy chce dodac nowa tablice, tworze obiekt poprzez "new" i adres jest przypisywany w kolejne miejsce statycznej tablicy. tablica wskaznikow na obiekty ma nazwe baza[] funkcje np. wyswietl wywoluje w mainie >> baza[ temp - 1 ]->wyswietl(); main.cpp // uzywam switcha jako menu, wiec kod powinien byc czytelny. #include "stdafx.h"
int _tmain( int argc, _TCHAR * argv[] ) { unsigned select, temp, exit = 0; int lngt; Tablica_int * baza[ 10 ]; int & pnt = Tablica_int::ilosc; do { cout << "Witamy w programie *TABLICE*!\n" << pnt << " tablic w bazie\n\n"; cout << "\t 1) Utworz tablice\n"; cout << "\t 2) Wyswietl tablice\n"; cout << "\t 3) Posortuj tablice\n"; cout << "\t 4) Usun dana tablice\n"; cout << "\t 5) Zakoncz\n"; cout << "\n :"; cin >> select; switch( select ) { case 1: { system( "CLS" ); if( pnt == 10 ) { cout << "Osiagnieto limit bazy, aby dodac nowa, usun jedna z istniejacych\n"; break; } cout << "Jakich rozmiarow tablice chcesz utworzyc? :"; cin >> lngt; cout << endl; baza[ pnt ] = new Tablica_int( lngt ); break; } case 2: { system( "CLS" ); if( pnt == 0 ) cout << "Najpierw dodaj tablice do bazy\n"; else { cout << pnt << " Tablic w bazie, ktora chcesz wyswietlic? "; cin >> temp; if( temp > pnt || temp < 0 ) cout << "Nie ma takiej tablicy!\n"; baza[ temp - 1 ]->wyswietl(); } break; } case 3: { system( "CLS" ); cout << pnt << " Tablic w bazie, ktora chcesz posortowac? "; cin >> temp; baza[ temp - 1 ]->insert_sort(); break; } case 4: { system( "CLS" ); cout << pnt << " Tablic w bazie, ktora chcesz usunac? "; cin >> temp; if( pnt == 1 ) delete baza[ 0 ]; else { delete baza[ temp - 1 ]; for( int k = temp - 1; k < pnt - 1; k++ ) { baza[ k ] = baza[ k + 1 ]; } } break; } case 5: { for( int i = 0; i != pnt; i++ ) delete baza[ i ]; exit = 1; break; } } } while( !exit ); cin.get(); return 0; }
a tutaj plik naglowkowy klasy Tablica_int.h #pragma once class Tablica_int { int n; int * tab; public: Tablica_int( int rozmiar ); ~Tablica_int() { ilosc--; }; static int ilosc; void wypelnij(); void wyzeruj(); void wyswietl(); void insert_sort(); };
oraz Tablica_int.cpp // plik z funkcjami #include "stdafx.h" #include "Tablica_int.h"
int Tablica_int::ilosc = 0;
Tablica_int::Tablica_int( int rozmiar ) { n = rozmiar; tab = new int[ n ]; wypelnij(); ilosc++; }
void Tablica_int::wypelnij( void ) { for( int i = 0; i < n; i++ ) { cout << "Wprowadz " << i << "# element: "; cin >> tab[ i ]; cout << endl; } }
void Tablica_int::wyzeruj( void ) { for( int i = 0; i < n; i++ ) { tab[ i ] = 0; } }
void Tablica_int::wyswietl() { cout << "\n--------------\n"; cout << "Tablica nr:" << Tablica_int::ilosc << endl; cout << tab[ 0 ] << tab[ 1 ] << tab[ 2 ] << endl; cout << "--------------\n"; }
void Tablica_int::insert_sort( void ) { int k, temp; for( int i = 0; i <( n - 1 ); i++ ) { if( tab[ i + 1 ] < tab[ i ] ) { k = i; while( tab[ i + 1 ] < tab[ k ] ) { k--; } if( k == i ) swap( tab[ i ], tab[ i + 1 ] ); else { temp = tab[ i + 1 ]; for( int l = i + 1; l > k; l-- ) { tab[ l ] = tab[ l - 1 ]; } tab[ k + 1 ] = temp; } } wyswietl(); } }
Bede wdzieczny za pomoc, pozdrawiam. |
|
pekfos |
» 2013-03-10 19:51:38 Zamień baza[ pnt ] = new Tablica_int( lngt );
na baza[ pnt - 1 ] = new Tablica_int( lngt );
|
|
maze Temat założony przez niniejszego użytkownika |
» 2013-03-10 20:11:56 dzieki,
musiales przejrzec kod, zauwazyles jakies razace bledy? o.O |
|
pekfos |
» 2013-03-10 20:18:04 Nigdzie nie sprawdzasz poprawności danych i strumienia. |
|
maze Temat założony przez niniejszego użytkownika |
» 2013-03-10 20:32:07 dzieki za uwage, do { cin.clear(); cin.sync(); cin >> lngt; cout << endl; } while( cin.fail() );
taki mechanizm jest dobry?? |
|
maze Temat założony przez niniejszego użytkownika |
» 2013-03-10 23:46:50 hej mam takie pytanie, mianowicie chodzi mi o przeladowanie operatora "+" , ktory sumuje ze soba elementy dwoch klas. Wyglada on u mnie nastepujaco: Tablica operator +( Tablica a, Tablica b ) { int k =( a.n > b.n ) ? a.n : b.n; Tablica c( k ); for( int i = 0; i < k; i++ ) { c.tab[ i ] =(( i > a.n ) ? 0 : a.tab[ i ] ) +(( i > b.n ) ? 0 : b.tab[ i ] ); } return c; }
definiuje to przeladowanie w glownym pliku main, i przez to nie mam dostepu do skladnikow prywatnych klasy, przez co przestawilem te skladniki na public zeby przeladowanie dzialalo. I tu moje pytanie, jak zdeklarowac to przeladowanie, aby mialo ono dostep do skladnikow prywatnych klasy? Jak to mozna rozwiazac? pozdrawiam |
|
Monika90 |
» 2013-03-11 01:09:44 1. Klasa Tablica_int jest błędna. Jeżeli przydzielasz pamięć w konstruktorze, to powinieneś ją zwalniać w destruktorze. Poza tym musisz rozwiązać problem kopiowania, czyli, albo uniemożliwić kopoiowanie obiektów Tablica_int, albo zaimplementować prawidłowo konstruktor kopiujący i operator przypisania.
2. Nie ma czegoś takiego jak przeładowanie operatora, zapewne chodzi Ci o przeciążenie.
3. W przypadku operatora + klasycznym rozwiązaniem jest zdefiniowanie operatora += jako składowej klasy, a potem zaimplementowanie + za pomocą +=. U Ciebie jednak nie jest to konieczne, bo klasa taka jak Tablica i tak powinna dawać dostęp do swoich elementów i rozmiaru. Oczywiście nie za pomocą publicznych pól, ale za pomocą publicznych metod.
No ale punkt 1 jest najważniejszy, bez tego Twój program po prostu nie działa... |
|
pekfos |
» 2013-03-11 11:23:33 Przeciążenie operatora w formie funkcji (a takie próbowałeś zrobić) musi być zaprzyjaźnione z klasą. |
|
« 1 » 2 |