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

konwersja typu K na typ wskaznik do M

Ostatnio zmodyfikowano 2015-03-22 07:44
Autor Wiadomość
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
C/C++
//Code::Blocks 13.12! codeblocks-13.12mingw-setup-TDM-GCC-481.exe Windows XP
#include <iostream>
#include <cstring>  //dla strcpy
#include <string>
using namespace std;
class K; //deklaracja zapowiadajaca
class M {
private:
    char * str;
public:
    //........konstruktor
    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;
    }
   
    //deklaracja konstruktora jednoargumentowego konwertujacego w klasie M ,
    //przjmuje klase K i zwraca klase M
    M( K );
    friend void print( char * str );
    void pokaz()
    {
        cout << "void pokaz() " << * this << endl;
    }
   
};
class K {
private:
    string tekst;
    friend M::M( K );
public:
    //........konstruktor
    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 )
{
    //konwersja z string na tablice char*
    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()
{
    //K Knapis;
    //Knapis.show();
   
    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ę.

P-128895
pekfos
» 2015-03-21 21:20:21
funkcje wypisują nie to czego oczekuję.
A czego oczekujesz..?
P-128897
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.
P-128902
pekfos
» 2015-03-21 22:21:56
C/C++
M::M( K n )
{
    //konwersja z string na tablice char*
    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*".

C/C++
operator char *()
{
    char * str = new char[ tekst.length() + 1 ];
    strcpy( str, tekst.c_str() );
    return str;
}
Coś takiego było w książce..?
P-128903
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.
C/C++
//Code::Blocks 13.12! codeblocks-13.12mingw-setup-TDM-GCC-481.exe Windows XP
#include <iostream>
#include <cstring>  //dla strcpy
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
C/C++
M::M( K n )
{
    //konwersja z string na tablice char*
    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()
P-128906
pekfos
» 2015-03-21 22:59:45
C/C++
char * str = new char[ n.tekst.length() + 1 ];
Usuń "char*".
P-128907
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.
C/C++
//Code::Blocks 13.12! codeblocks-13.12mingw-setup-TDM-GCC-481.exe Windows XP
#include <iostream>
#include <cstring>  //dla strcpy
#include <string>
using namespace std;
class K; //deklaracja zapowiadajaca
class M {
private:
    char * str;
public:
    //........konstruktor
    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;
    }
   
    //deklaracja konstruktora jednoargumentowego konwertujacego w klasie M ,
    //przjmuje klase K i zwraca klase M
    M( K );
    friend void print( char * str );
    void pokaz()
    {
        cout << "void pokaz() " << * this << endl;
    }
   
};
class K {
private:
    string tekst;
    friend M::M( K );
public:
    //........konstruktor
    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 )
{
    //konwersja z string na tablice char*
    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()
{
    //K Knapis;
    //Knapis.show();
   
    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;
}
P-128909
« 1 »
  Strona 1 z 1