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

[C++] Przeciążenie operatora []

Ostatnio zmodyfikowano 2015-01-07 16:34
Autor Wiadomość
Lukier
Temat założony przez niniejszego użytkownika
[C++] Przeciążenie operatora []
» 2015-01-05 19:51:29
Witam. Mam pewien problem odnośnie przeciążenia operatora [] i nie mogę znaleźć błędu. Kompiluje się program, wszystko jest ok, ale nie działa sama funkcja przeciążająca. Możliwe, że problem leży w wywoływaniu danego przeciążenia (w funkcji print), no ale do końca nie jestem pewien. Prosił bym o pomoc w znalezieniu błędu.

C/C++
#include<iostream>
using namespace std;

class A
{
    int v;
public:
    void set( int i )
    {
        v = i;
    }
    A() { v = 0; }
    int get()
    {
        return v;
    }
    friend class B;
};

class B
{
    A * no;
    int size;
    int l;
    int z;
public:
    B() { no = new A(); size = 0; }
    B( int j )
    {
        l = z = 0;
        no = new A[ j ];
        size = j;
        for( int i = 0; i < j; i++ )
        {
            no[ i ].set( i );
        }
    }
    friend ostream & operator <<( ostream & wyjscie, B * obiekt );
    friend istream & operator >>( istream & wejscie, B * obiekt );
    ~B() { delete[] no; }
    B & operator =( B * obiekt )
    {
        for( int i = 0; i < size; i++ )
        {
            no[ i ].set( 1 );
        }
        return * this;
    }
    A & operator []( int dup )
    {
        if( dup < 0 || dup >= size )
        {
            cout << "Nie dozwolony index" << endl;
            exit( 0 );
        }
        return no[ dup ];
    }
    void print( int i )
    {
        cout << "no[i].v: " << no[ i ].v << endl;
    }
    A * operator ->()
    {
        return & no[ 3 ];
    }
    int operator ()()
    {
        int x = 0;
        for( int i = 0; i < size; i++ )
        {
            x = x + no[ i ].get();
        }
        return x;
    }
};



ostream & operator <<( ostream & wyjscie, B * obiekt )
{
    for( int i = 0; i < obiekt->size; i++ )
    {
        wyjscie << obiekt->no[ i ].get() << endl;
    }
    return wyjscie;
}

istream & operator >>( istream & wejscie, B * obiekt )
{
    int k;
    cin >> k;
    for( int i = 0; i < obiekt->size; i++ )
    {
        obiekt->no[ i ].set( k );
    }
    return wejscie;
}

void main()
{
    B * obiekt;
    obiekt = new B( 10 );
    cout << obiekt << endl;
    B * obiekt2;
    obiekt2 = new B( 7 );
    cin >> obiekt2;
    cout << obiekt2 << endl;
    ( * obiekt ) = obiekt2;
    cout << " = " << endl << obiekt << endl;
    cout << " [] "; obiekt->print( 50 );
    cout << " -> " <<( * obiekt )->get() << endl;
    cout << " () " <<( * obiekt2 )() << endl;
}

P-124252
darko202
» 2015-01-06 01:03:46
>>Możliwe, że problem leży w wywoływaniu danego przeciążenia (w funkcji print), no ale do końca nie jestem pewien.

C/C++
//zauważyłem że wywołujesz
cout << " [] "; obiekt->print( 50 );
//a to jest
cout << "no[i].v: " << no[ i ].v << endl;

//gdzie
A * no;
//i
B( int j )
{...
    no = new A[ j ];
    ...}

//a w main
B * obiekt;
obiekt = new B( 10 );

//czyli A[50] nie istnieje

P-124281
Lukier
Temat założony przez niniejszego użytkownika
» 2015-01-06 10:05:33
No tak, nie istnieje i powinna mi moja funkcja przeciążająca zwrócić cout, że nie istnieje i zakończyć działanie programu w momencie kiedy odwołuję się do indeksu z poza granicy no[50].v lecz program zachowuję się tak jakby zdefiniowane przeze mnie przeciążenie nie istniało, czyli się zawiesza bo odwołuje się do nie zaalokowanego przeze mnie fragmentu pamięci. Nie rozumiem dlaczego tak się dzieje, z mojego punktu widzenia wszystko wygląda poprawnie.
P-124285
1aam2am1
» 2015-01-06 10:17:07
zamiast exit(0); wstaw pause do czasu aż nie wciśniesz klawisza, bo cout może nie zdążyć wyświetlić ci danej rzeczy na  ekranie przed zakończeniem działania programu
Możesz użyć std::cerr zamiast std::cout do wyświetlania błędów
P-124286
Lukier
Temat założony przez niniejszego użytkownika
» 2015-01-06 10:35:49
Dzięki za rady lecz niestety nie rozwiązuje to mojego problemu ponieważ jak wspomniałem wyżej program zachowuje się cały czas tak jakby moja funkcja przeciążająca nie istniała.
P-124290
1aam2am1
» 2015-01-06 11:10:08
C/C++
void print( int i )
{
    cout << "no[i].v: " << no[ i ].v << endl;
}
Mam małe pytanie? Nie dziw że operator nie jest używany. jak go nie używasz (nie używasz operatora [])
P-124292
Lukier
Temat założony przez niniejszego użytkownika
» 2015-01-06 12:35:04
Tak właśnie myślałem, że to może być powodem. Czyli jak mam go aby funkcja przeciążająca poprawnie mi sprawdzała czy nie przekraczam zakresu tablicy elemencie klasy no? Nie rozumiem tego za bardzo.
P-124299
1aam2am1
» 2015-01-06 15:54:37
C/C++
void print( int i )
{
    cout << "no[i].v: " <<( * this )[ i ].v << endl;
}
P-124326
« 1 » 2
  Strona 1 z 2 Następna strona