Nitr0Skay Temat założony przez niniejszego użytkownika |
Wyświetlanie wartości obiektu poprzez jego nazwę » 2015-11-03 18:30:57 Witam. Mam następujący kod: #include <iostream> #include <string.h> #include <sstream>
class BigNumber { public: const static short ZERO = 0; const static short ONE = 1; private: std::string number; public: BigNumber( char number[] ); BigNumber( long double ); BigNumber(); };
BigNumber::BigNumber() { std::cout << "test" << std::endl; }
BigNumber::BigNumber( char number[] ) { this->number =( std::string ) number; }
BigNumber::BigNumber( long double Dnumber ) { std::stringstream buffer; std::string number; buffer << Dnumber; buffer >> number; this->number = number; }
int main() { BigNumber x = 25; std::cout << x; }
Moim celem jest wyświetlenie wartości obiektu (chodzi mi o pole std::string number; , w ten sposób: Otóż chciałbym skopiować (i połączyć) dwie ciekawe klasy z Javy do C++. Jak wiadomo, tam do System.out.println() można przekazać sam obiekt klasy BigInteger/BigDecimal (oczywiście obiekt, do którego przypisaliśmy określoną wartość), po czym zostanie wyświetlona wartość tego obiektu. To samo chciałbym uzyskać w C++. Czy jest to możliwe ? I jakie narzędzia do tego są potrzebne, aby osiągnąć dany efekt ?? Z góry dziękuję za potrzebne informacje i nakierowania. |
|
Gibas11 |
» 2015-11-03 19:00:25 Przeciąż operator << klasy ostream. #include <iostream> #include <string> using namespace std;
class z { public: string someShit; };
ostream & operator <<( std::ostream & s, const z & zupka ) { return s << zupka.someShit; }
int main() { z zupa; zupa.someShit = "ogórkowa"; cout << zupa; return 0; }
|
|
michal11 |
» 2015-11-03 19:02:09 Nnie zapomnij zaprzyjaźnić tego operatora jeżeli chcesz korzystać ze zmiennych prywatnych. |
|
Nitr0Skay Temat założony przez niniejszego użytkownika |
» 2015-11-03 19:04:23 ostream & operator <<( std::ostream & s, const z & zupka ) { return s << zupka.someShit; }
Prawdę pisząc, nie znam tego tricku i zapewne bym na to nie wpadł. Do tego nie bardzo rozumiem tego kodu. |
|
michal11 |
» 2015-11-03 19:09:07 Wyświetlanie na konsoli za pomocą cout cout << 11; to nic innego jak zwykłe wywołanie funkcji (w tym wypadku dla uproszczenia można powiedzieć specjalnej funkcji) jaką jest operator. W twoim kodzie: int main() { BigNumber x = 25; std::cout << x; }
Tak naprawdę wygląda to tak: int main() { BigNumber x = 25; operator <<( std::cout, x ); }
Ale nigdzie nie ma stworzonej takiej funkcji (dla typów podstawowych to działa bo taka funkcja jest napisana w bibliotece standardowej). Dlatego aby taki zapis zadziałał musisz sam napisać taką funkcję. Akurat operator<< musi mieć następująca definicje żeby został w poprawny sposób wywołany: ostream & operator <<( ostream & os, T t ); gdzie T to twoja klasa, dodatkowo, co już napisałem, aby taka funkcja miała dostęp do prywatnych składowych klasy musi być zaprzyjaźniona czyli ostatecznie wyglądałoby to mniej więcej tak: class BigNumber { public: const static short ZERO = 0; const static short ONE = 1; private: std::string number; public: BigNumber( char number[] ); BigNumber( long double ); BigNumber(); friend ostream & operator <<( ostream & os, BigNumber bn ); };
|
|
Gibas11 |
» 2015-11-03 19:19:16 ostream & operator <<( ostream & os, BigNumber bn ); To kiepskie rozwiązanie, BigNumber jak sama nazwa wskazuje może być duże (mi zdarzało się operować na obiektach po kilkaset MB) a wtedy kopiowanie tego jest złym pomysłem, lepiej użyć ostream & operator <<( ostream & os, const BigNumber & bn ); . const by nie uszkodzić obiektu i & by operować na oryginale. |
|
Nitr0Skay Temat założony przez niniejszego użytkownika |
» 2015-11-03 19:28:54 Zadziałało. Dziękuję Panowie. Przede mną jak widać wiele pracy i wiele nauki. Nie do końca rozumiem, co się w tej funkcji dzieje, ale postaram się szybko uzupełnić wiedzę, nim przystąpię do dalszej pracy. Jeszcze raz dziękuję Wam za pomoc. :) Przy okazji, tak wygląda kod: #include <iostream> #include <string.h> #include <sstream>
class BigNumber { public: const static short ZERO = 0; const static short ONE = 1; private: std::string number; public: BigNumber( char number[] ); BigNumber( long double ); BigNumber(); friend std::ostream & operator <<( std::ostream & os, const BigNumber & number ); };
BigNumber::BigNumber() { std::cout << "test" << std::endl; }
BigNumber::BigNumber( char number[] ) { this->number =( std::string ) number; }
BigNumber::BigNumber( long double Dnumber ) { std::stringstream buffer; std::string number; buffer << Dnumber; buffer >> number; this->number = number; }
std::ostream & operator <<( std::ostream & os, const BigNumber & number ) { return os << number.number; }
int main() { BigNumber x = 25; std::cout << x; }
Dziękuję |
|
« 1 » |