Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z tablica przy wywolywaniu funkcji klasy.

Ostatnio zmodyfikowano 2013-03-11 20:24
Autor Wiadomość
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.

C/C++
#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; //licznik ilosci obiektow == zmienna statyczna klasy
   
   
   
    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

C/C++
#pragma once
class Tablica_int
{
    int n;
    int * tab;
   
public:
   
    Tablica_int( int rozmiar ); //Konstruktor zapelnia tablicy przy tworzeniu
    ~Tablica_int() { ilosc--; };
   
    static int ilosc;
    void wypelnij();
    void wyzeruj();
    void wyswietl();
    void insert_sort();
   
};

oraz Tablica_int.cpp // plik z funkcjami

C/C++
#include "stdafx.h"
#include "Tablica_int.h"

//inicjalizowanie zmiennej statycznej klasy, licznika obiektow
//**********************************************************
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;
    /*for(int k=0; k<n; k++)
    {
    cout << "\t" << k+1 <<")\t"<< tab[k] << 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 ] ) //Sprawdzamy czy element na nastepnej pozycji jest mniejszy od obencego.
        {
            k = i;
            while( tab[ i + 1 ] < tab[ k ] ) //Wtedy zliczamy do poczatku ile jest mniejszych elementow
            { //Zmienna k to wskaznik odpowiedniego miejsca.
                k--;
            }
           
            if( k == i ) swap( tab[ i ], tab[ i + 1 ] ); //Jezeli element przesuwamy tylko o jedno miejsce,
            //poprostu zamieniamy dwa sasiadujace.
           
            else //W innym wypadku, kopiujemy element do tempa, przesuwamy
            { // wszytskie elementy w prawo, i wsadzamy go w odpowiednie miejsce.
                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.
P-78058
pekfos
» 2013-03-10 19:51:38
Zamień
C/C++
baza[ pnt ] = new Tablica_int( lngt );
na
C/C++
baza[ pnt - 1 ] = new Tablica_int( lngt );
P-78071
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
P-78072
pekfos
» 2013-03-10 20:18:04
Nigdzie nie sprawdzasz poprawności danych i strumienia.
P-78074
maze
Temat założony przez niniejszego użytkownika
» 2013-03-10 20:32:07
dzieki za uwage,

C/C++
do {
    cin.clear(); cin.sync();
    cin >> lngt; cout << endl;
} while( cin.fail() );


taki mechanizm jest dobry??


P-78078
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:

C/C++
Tablica operator +( Tablica a, Tablica b )
{
    int k =( a.n > b.n ) ? a.n
        : b.n; //a.n --> rozmiar tablicy obiektu a
    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
P-78089
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...
P-78091
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ą.
P-78095
« 1 » 2
  Strona 1 z 2 Następna strona