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

Wyświetlanie wartości obiektu poprzez jego nazwę

Ostatnio zmodyfikowano 2015-11-03 19:28
Autor Wiadomość
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:

C/C++
#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:

C/C++
std::cout << x;

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.
P-139557
Gibas11
» 2015-11-03 19:00:25
Przeciąż operator
<<
 klasy ostream.
C/C++
#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;
}
P-139566
michal11
» 2015-11-03 19:02:09
Nnie zapomnij zaprzyjaźnić tego operatora jeżeli chcesz korzystać ze zmiennych prywatnych.
P-139567
Nitr0Skay
Temat założony przez niniejszego użytkownika
» 2015-11-03 19:04:23
C/C++
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.
P-139568
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:
C/C++
int main() {
    BigNumber x = 25;
    std::cout << x;
}
Tak naprawdę wygląda to tak:
C/C++
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:
C/C++
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 );
};
P-139570
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.
P-139573
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:

C/C++
#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ę
P-139577
« 1 »
  Strona 1 z 1