Cdorsu Posted January 17, 2016 Share Posted January 17, 2016 Pe langa metoda clasica de conversii: #include <iostream> int main() { void* pvValoare = new int(3); int iValoare = *(int*)(pvValoare); } exista si unele metode de conversii care se axeaza destul de mult pe pointer: dynamic_cast, static_cast, const_cast si reinterpret_cast. Toate avand acelasi tip de argument si aceeasi metoda de folosire. dynamic_cast<tip_in_care_dorim_sa_facem_conversia>(argument); static_cast<tip_in_care_dorim_sa_facem_conversia>(argument); reinterpret_cast<tip_in_care_dorim_sa_facem_conversia>(argument); const_cast<tip_in_care_dorim_sa_facem_conversia>(argument); O sa vorbesc putin despre fiecare. O sa incep cu cel mai usor: const_cast Face conversii intre tipuri de date constante si neconstante. #include <iostream> int main() { const char* pcText = "Text"; char* pcText1 = pcText; } Codul de mai sus va produce o eroare, pe cand codul de mai jos nu. #include <iostream> int main() { const char* pcText = "Text"; char* pcText1 = const_cast<char*>(pcText); } reinterpret_cast Converteste un pointer catre orice alt tip de pointer. #include <iostream> class clasa_mea { private: int m_iValoare; public: clasa_mea(int arg):m_iValoare(arg) {}; }; class clasa_mea1 { private: int m_iValoare; public: clasa_mea1(int arg):m_iValoare(arg) {}; void print() { std::cout<<m_iValoare; }; }; int main() { clasa_mea* pcmPointer = new clasa_mea(3); clasa_mea1* pcm1Pointer = pcmPointer; pcm1Pointer->print(); } Codul de mai sus produce o eroare, codul de mai jos nu produce o eroare. #include <iostream> class clasa_mea { private: int m_iValoare; public: clasa_mea(int arg):m_iValoare(arg) {}; }; class clasa_mea1 { private: int m_iValoare; public: clasa_mea1(int arg):m_iValoare(arg) {}; void print() { std::cout<<m_iValoare; }; }; int main() { clasa_mea* pcmPointer = new clasa_mea(3); clasa_mea1* pcm1Pointer = reinterpret_cast<clasa_mea1*>(pcmPointer); pcm1Pointer->print(); } static_cast Converteste un pointer catre o clasa familiara (mostenitoare sau mostenita) #include <iostream> class clasa_mea { public: int m_iValoare; clasa_mea(int arg):m_iValoare(arg) {}; }; class clasa_mea1:public clasa_mea { private: int m_iValoare1; public: void print() { std::cout<<m_iValoare<<' '<<m_iValoare1; }; }; int main() { clasa_mea* pcmPointer = new clasa_mea(3); clasa_mea1* pcm1Pointer = pcmPointer; pcm1Pointer->print(); } Acest cod produce eroare si, cred ca deja v-ati prins, codul de mai jos nu. #include <iostream> class clasa_mea { public: int m_iValoare; clasa_mea(int arg):m_iValoare(arg) {}; }; class clasa_mea1:public clasa_mea { private: int m_iValoare1; public: void print() { std::cout<<m_iValoare<<' '<<m_iValoare1; }; }; int main() { clasa_mea* pcmPointer = new clasa_mea(3); clasa_mea1* pcm1Pointer = static_cast<clasa_mea1*>(pcmPointer); pcm1Pointer->print(); } static_cast va apela constructorul care are un singur parametru. static_cast poate face conversii intre tipuri numerice. Exemplu: int->float, float->int static_cast poate face conversii catre o referinta rvalue. static_cast poate face conversii intre o enumeratie si un int. dynamic_cast Poate face conversii doar cu pointeri si referinte (sau void*) intre clase familiare #include <iostream> class clasa_baza { private: int m_iValoare; public: clasa_baza(int arg):m_iValoare(arg) {}; virtual void Ceva() { }; void Print() { std::cout<<m_iValoare; }; int GetValoare() { return m_iValoare; }; }; class clasa_derivata:public clasa_baza { int m_iValoare; public: clasa_derivata(int arg, int arg1):clasa_baza(arg1), m_iValoare(arg) {}; void print() { std::cout<<m_iValoare<<' '<<GetValoare(); }; }; int main() { clasa_baza* pcbPointer = new clasa_derivata(5,3); clasa_derivata* pcdObiect1 = pcbPointer; pcdObiect1->print(); } Codul de mai sus eroare, codul de mai jos succes. #include <iostream> class clasa_baza { private: int m_iValoare; public: clasa_baza(int arg):m_iValoare(arg) {}; virtual void Ceva() { }; void Print() { std::cout<<m_iValoare; }; int GetValoare() { return m_iValoare; }; }; class clasa_derivata:public clasa_baza { int m_iValoare; public: clasa_derivata(int arg, int arg1):clasa_baza(arg1), m_iValoare(arg) {}; void print() { std::cout<<m_iValoare<<' '<<GetValoare(); }; }; int main() { clasa_baza* pcbPointer = new clasa_derivata(5,3); clasa_derivata* pcdObiect1 = dynamic_cast<clasa_derivata*>(pvPointer); pcdObiect1->print(); } Sper ca ati inteles ceva din ce am incercat eu sa explic. 2 Link to comment Share on other sites More sharing options...
eB Cosmarul Posted January 17, 2016 Share Posted January 17, 2016 Felicitari, multumesc. Link to comment Share on other sites More sharing options...
FnZ Posted January 17, 2016 Share Posted January 17, 2016 Felicitari, imi place este destul de reusit Link to comment Share on other sites More sharing options...
Cdorsu Posted January 17, 2016 Author Share Posted January 17, 2016 Felicitari, multumesc. Felicitari, imi place este destul de reusit Multumesc! Link to comment Share on other sites More sharing options...
FnZ Posted January 17, 2016 Share Posted January 17, 2016 Cu placere, daca ai putea si stii pawno putem face un server de samp sau o idee de GM. Link to comment Share on other sites More sharing options...
Cdorsu Posted January 17, 2016 Author Share Posted January 17, 2016 Cu placere, daca ai putea si stii pawno putem face un server de samp sau o idee de GM. Nu prea-mi place pawno si, in plus, nici macar nu ma mai joc sa:mp... Link to comment Share on other sites More sharing options...
FnZ Posted January 17, 2016 Share Posted January 17, 2016 Nu prea-mi place pawno si, in plus, nici macar nu ma mai joc sa:mp... In regula, nu oblig pe nimeni. Link to comment Share on other sites More sharing options...
zL Dark ReturN Posted January 19, 2016 Share Posted January 19, 2016 Felicitari, multumesc. Daca nu faci posturi mai lungi de 3 cuvinte, s'ar putea sa te sanctioneze vreun administrator daca se uita aici. T/C. Link to comment Share on other sites More sharing options...
Recommended Posts