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

Przeładowanie operatora wyjścia strumienia

Ostatnio zmodyfikowano 2015-10-09 20:38
Autor Wiadomość
ast44
Temat założony przez niniejszego użytkownika
Przeładowanie operatora wyjścia strumienia
» 2015-10-09 11:30:37
Napisałem taki program :

C/C++
#include <iostream>

using namespace std;

class Klasa
{
public:
   
    int x, kolumny = 4, wiersze = 4;
    double ** macierz;
    string str;
   
   
   
    ostream & operator <<( ostream & strumien )
    {
        int i, j;
        strumien << x << endl;
        strumien << str << endl;
       
        for( i = 0; i < kolumny; i++ )
        {
            for( j = 0; j < wiersze; j++ )
            {
                strumien << macierz[ i ][ j ];
            }
            strumien << endl;
        }
        return strumien;
       
    }
   
    Klasa( int _x, string _str )
    {
        int i, j;
        x = _x;
        str = _str;
       
        double ** macierz = new double *[ kolumny ];
        for( i = 0; i < kolumny; i++ )
        {
            macierz[ i ] = new double[ wiersze ];
           
            for( j = 0; j < wiersze; j++ )
            {
                macierz[ i ][ j ] = i + j;
            }
        }
       
    }
   
    ~Klasa()
    {
        int n;
       
        for( n = 0; n < kolumny; n++ )
       
        {
            delete[] macierz[ n ];
        }
       
        delete[] macierz;
        macierz = NULL;
       
    }
   
};

int main()
{
    Klasa klasa( 5, "kot" );
    klasa << cout;
   
    return 0;
}

No i program poprawnie wypisuje int i string ,ale tablicy już nie (przestaje przy niej działać).Doszedłem do tego że błąd znajduje się przy przeciążaniu operatora << w sekcji z wypisywaniem macierzy.Nie wiem jednak na czym polega.
P-138313
Monika90
» 2015-10-09 12:48:36
Błąd masz w konstruktorze, w tej linii:
C/C++
double ** macierz = new double *[ kolumny ];
P-138314
ast44
Temat założony przez niniejszego użytkownika
» 2015-10-09 18:49:58
A co w niej jest złego ?
P-138326
mateczek
» 2015-10-09 19:34:38
ostream & operator <<( ostream & strumien )
czy to jest w porządku ??
tak przeładowany operator chyba wywoła się tylko w sytuacji
obiektKlasy << cout;


Nie wykona się gdy będzie takie wywołanie
cout << obiektklasy;


Trzeba chyba zrobić funkcje zaprzyjaźnioną z klasą w stylu
ostream & operator <<( ostream & strumien, kalas & objekt )


A co w niej jest złego ?
może to że napierw deklaruje się tablice wierszy a potem przestrzeń na wiersz(kolumny)  ale to kwestia wyobraźni przestrzennej
P-138327
Monika90
» 2015-10-09 19:48:03
A co w niej jest złego ?
Iinicjalizujesz zmienną lokalną zamiast składowej klasy.
P-138328
mateczek
» 2015-10-09 20:12:25
ok sorki :) właśnie zauważyłem :)
tak być powinno :)
macierz = new double *[ kolumny ];

ale zobacz takie przeładownie operatora
C/C++
#include <iostream>
#include<string>
using namespace std;

class Klasa
{
public:
    friend ostream & operator <<( ostream & strumien, const Klasa & k );
    int x, kolumny = 4, wiersze = 4;
    double ** macierz;
    string str;
   
    Klasa( int _x, string _str )
    {
        int i, j;
        x = _x;
        str = _str;
       
        macierz = new double *[ kolumny ];
        for( i = 0; i < kolumny; i++ )
        {
            macierz[ i ] = new double[ wiersze ];
           
            for( j = 0; j < wiersze; j++ )
            {
                macierz[ i ][ j ] = i + j;
            }
        }
       
    }
   
    ~Klasa()
    {
        int n;
       
        for( n = 0; n < kolumny; n++ )
       
        {
            delete[] macierz[ n ];
        }
       
        delete[] macierz;
        macierz = NULL;
       
    }
   
};


ostream & operator <<( ostream & strumien, const Klasa & k )
{
    int i, j;
    strumien << k.x << endl;
    strumien << k.str << endl;
   
    for( i = 0; i < k.kolumny; i++ )
    {
        for( j = 0; j < k.wiersze; j++ )
        {
            strumien << k.macierz[ i ][ j ];
        }
        strumien << endl;
    }
    return strumien;
   
}


int main()
{
    Klasa klasa( 5, "kot" );
    cout << klasa << "koniec wypisywania" << endl;
   
    return 0;
}
P-138330
ast44
Temat założony przez niniejszego użytkownika
» 2015-10-09 20:38:23
Jakkolwiek pokracznie i dziwnie to wygląda chciałem właśnie żeby zrobić przeciążanie jako metodę klasy.Dzięki, zgapiłem się że już zrobiłem wskaźnik a potem zacząłem go pisać od nowa.
P-138335
« 1 »
  Strona 1 z 1