konwersja typu K na typ wskaznik do M
Ostatnio zmodyfikowano 2015-03-22 07:44
tonight Temat założony przez niniejszego użytkownika |
konwersja typu K na typ wskaznik do M » 2015-03-21 20:52:50 Jak w temacie. Chce jawnie konwertować obiekt typu K na obiekt typu wskaźnik do M (czyli M*). Jest to ćwiczenie z Symfonii C++ - Jerzego Grębosza. Rozdział 18 ćw.XIV Napisałem taki programik #include <iostream> #include <cstring> #include <string> using namespace std; class K; class M { private: char * str; public: M() { strcpy( str, "Invicrus" ); } M( const char * slowo ) { int rozmiar = strlen( slowo ) + 1; str = new char[ rozmiar ]; strcpy( str, slowo ); } ~M() { cout << "Pracuje destruktor str " << str << endl; delete[] str; } operator char *() { return str; } M( K ); friend void print( char * str ); void pokaz() { cout << "void pokaz() " << * this << endl; } }; class K { private: string tekst; friend M::M( K ); public: K() { tekst = "Gloria Victis"; } K( string opis = "Elessar" ) : tekst( opis ) { } void show() { cout << "string tekst; " << tekst << endl; } operator string() { return tekst.c_str(); } operator char *() { char * str = new char[ tekst.length() + 1 ]; strcpy( str, tekst.c_str() ); return str; } friend void print( char * str ); ~K() { cout << "Pracuje destruktor K " << tekst << endl; } }; M::M( K n ) { cout << "M::M(K n) n.tekst " << n.tekst << endl; char * str = new char[ n.tekst.length() + 1 ]; strcpy( str, n.tekst.c_str() ); cout << "M::M(K n) str " << str << endl; cout << "<-- O nie destruktor zaczyna pracowac " << endl; } void print( char * str ) { cout << "void print(char * str) " << str << endl; } int main() { cout << "\n*************** M objM(\"Mason London 22\") ******************" << endl; M objM( "Mason London 22" ); print( objM ); char * napis; napis =( char * ) objM; cout << "napis = (char*)objM; " << napis << endl; char * text; text = static_cast < char *>( objM ); cout << "text = static_cast<char*>( objM ); " << text << endl; cout << "\n*************** M Mobj( objK ); ******************" << endl; K objK( "Arwena" ); objK.show(); char * napis3; napis3 =( char * ) objK; cout << "napis3 = (char*)objK; " << napis3 << endl; cout << endl; M Mobj( objK ); print( Mobj ); Mobj.pokaz(); char * napis2; napis2 =( char * ) Mobj; cout << "napis2 = (char*)Mobj; " << napis2 << endl; cout << "\n\nPrzy jawnej konwertacji jest niemozliwa forma funkcji M*(objK)\n"; cout << "\n\n.....Czytaj Jerzy Grebosz - Symfonia C++\n" "Roz. 18.6.2 Advocatus zapisu \"rzutowania\" str.698\n" << endl; cout << "\n\n\t..........KONIEC..........\n" << endl; cin.get(); cin.get(); return 0; }
Przy wyświetlaniu print(Mobj); lub Mobj.pokaz(); funkcje wypisują nie to czego oczekuję. Czy może mi ktoś powiedzieć co jest nie tak, lub ewentualnie poprawić czy naprowadzić. Z góry serdecznie dziękuję. |
|
pekfos |
» 2015-03-21 21:20:21 funkcje wypisują nie to czego oczekuję. |
A czego oczekujesz..? |
|
tonight Temat założony przez niniejszego użytkownika |
» 2015-03-21 22:09:51 Na początku stworzyłem obiekt K objK("Arwena"); i wyświetliłem go objK.show(); Przy tworzeniu M Mobj( objK ); podstawiam objK i oczekiwałem że funkcje w klasie M print(Mobj); i Mobj.pokaz(); pokażą to samo co funkcja w klasie K objK.show(); czyli słowo Arwena. |
|
pekfos |
» 2015-03-21 22:21:56 M::M( K n ) { cout << "M::M(K n) n.tekst " << n.tekst << endl; char * str = new char[ n.tekst.length() + 1 ]; strcpy( str, n.tekst.c_str() ); cout << "M::M(K n) str " << str << endl; cout << "<-- O nie destruktor zaczyna pracowac " << endl; }
|
Usuń " char*". operator char *() { char * str = new char[ tekst.length() + 1 ]; strcpy( str, tekst.c_str() ); return str; }
|
Coś takiego było w książce..? |
|
tonight Temat założony przez niniejszego użytkownika |
» 2015-03-21 22:38:08 Usunięcie tego operatora spowoduje brak konwersji dla obiektów budowanych klasą K Przerabiając Symfonię C++ Jerzego Grębosza Rozdział 18.6.2 Advocatus zapisu rzutowania, ponieważ nie ma tam żadnego przykładu napisałem sobie taki programik. #include <iostream> #include <cstring> typedef char * tekst; using namespace std; class A { private: char * str; public: A( const char * zrodlo ) { int dlugosc = strlen( zrodlo ) + 1; str = new char[ dlugosc ]; strcpy( str, zrodlo ); } ~A() { delete[] str; } operator char *() { return str; } }; int main() { A obj( "Mason" ); char * napis; napis =( char * ) obj; cout << "(char*)obj; " << napis << endl; napis = tekst( obj ); cout << "tekst(obj); " << napis << endl; char * text; text = static_cast < char *>( obj ); cout << "static_cast<char*>( obj ); " << text << endl; cout << "\n\n\t..........KONIEC..........\n" << endl; cin.get(); cin.get(); return 0; }
Później rozwiązując ćwiczenia z tego rozdziału napotkałem na ćw XIV więc dopisałem następną klasę i chce rozwinąć program. Z tym że ta konwersja jakoś mi nie działa. Obiekt objK jest przekazywany do konstruktora jedno argumentowego konwertującego w klasie M M::M( K n ) { cout << "M::M(K n) n.tekst " << n.tekst << endl; char * str = new char[ n.tekst.length() + 1 ]; strcpy( str, n.tekst.c_str() ); cout << "M::M(K n) str " << str << endl; cout << "<-- O nie destruktor zaczyna pracowac " << endl; }
i ginie. Nie jest przechwytywany przez funkcję friend void print(char * str); czy też przez void pokaz() |
|
pekfos |
» 2015-03-21 22:59:45 char * str = new char[ n.tekst.length() + 1 ];
|
|
|
|
tonight Temat założony przez niniejszego użytkownika |
» 2015-03-22 07:44:09 Dziękuję "pekfos" za dobrą radę i poświęcony mi czas. Teraz programik szpila tak jak tego oczekiwałem. Poniżej wklejam poprawiony kod dla potomnych. #include <iostream> #include <cstring> #include <string> using namespace std; class K; class M { private: char * str; public: M() { strcpy( str, "Invicrus" ); } M( const char * slowo ) { int rozmiar = strlen( slowo ) + 1; str = new char[ rozmiar ]; strcpy( str, slowo ); } M( const M & zrodlo ) { int n = strlen( zrodlo.str ); str = new char[ n + 1 ]; strcpy( str, zrodlo.str ); } ~M() { cout << "Pracuje destruktor str " << str << endl; delete[] str; } operator char *() { return str; } M( K ); friend void print( char * str ); void pokaz() { cout << "void pokaz() " << * this << endl; } }; class K { private: string tekst; friend M::M( K ); public: K() { tekst = "Gloria Victis"; } K( string opis = "Elessar" ) : tekst( opis ) { } void show() { cout << "string tekst; " << tekst << endl; } operator string() { return tekst.c_str(); } operator char *() { char * str = new char[ tekst.length() + 1 ]; strcpy( str, tekst.c_str() ); return str; } friend void print( char * str ); ~K() { cout << "Pracuje destruktor K " << tekst << endl; } }; M::M( K n ) { cout << "M::M(K n) n.tekst " << n.tekst << endl; str = new char[ n.tekst.length() + 1 ]; strcpy( str, n.tekst.c_str() ); cout << "M::M(K n) str " << str << endl; cout << "<-- O nie destruktor zaczyna pracowac " << endl; } void print( char * str ) { cout << "void print(char * str) " << str << endl; } int main() { cout << "\n*************** M objM(\"Mason London 22\") ******************" << endl; M objM( "Mason London 22" ); print( objM ); char * napis; napis =( char * ) objM; cout << "napis = (char*)objM; " << napis << endl; char * text; text = static_cast < char *>( objM ); cout << "text = static_cast<char*>( objM ); " << text << endl; cout << "\n*************** M Mobj( objK ); ******************" << endl; K objK( "Arwena" ); objK.show(); char * napis3; napis3 =( char * ) objK; cout << "napis3 = (char*)objK; " << napis3 << endl; cout << endl; M Mobj( objK ); print( Mobj ); Mobj.pokaz(); char * napis2; napis2 =( char * ) Mobj; cout << "napis2 = (char*)Mobj; " << napis2 << endl; cout << "\n\nPrzy jawnej konwertacji jest niemozliwa forma funkcji M*(objK)\n"; cout << "\n\n.....Czytaj Jerzy Grebosz - Symfonia C++\n" "Roz. 18.6.2 Advocatus zapisu \"rzutowania\" str.698\n" << endl; cout << "\n\n\t..........KONIEC..........\n" << endl; cin.get(); cin.get(); return 0; }
|
|
« 1 » |