Przeładowanie operatora wyjścia strumienia
Ostatnio zmodyfikowano 2015-10-09 20:38
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 : #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. |
|
Monika90 |
» 2015-10-09 12:48:36 Błąd masz w konstruktorze, w tej linii: double ** macierz = new double *[ kolumny ];
|
|
ast44 Temat założony przez niniejszego użytkownika |
» 2015-10-09 18:49:58 A co w niej jest złego ? |
|
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 ) może to że napierw deklaruje się tablice wierszy a potem przestrzeń na wiersz(kolumny) ale to kwestia wyobraźni przestrzennej |
|
Monika90 |
» 2015-10-09 19:48:03 A co w niej jest złego ? Iinicjalizujesz zmienną lokalną zamiast składowej klasy. |
|
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 #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; }
|
|
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. |
|
« 1 » |