[C++] Zmienna dołączona do napisu


(Mnemonic) #1

Cześć, napisałem sobie taką klasę:

class Bird {

    string name;

    static int i;

  public:

    Bird()

    {

      i++;

      name="Bird#";

    };

    friend ostream& operator<<(ostream& os,Bird& abc)

    {

      os << abc.name <<'\n';

    }

    Bird(const Bird& ob)

    {

      cout << "konstruktor kopiujacy\n";

      name=ob.name;

      i++;

    }

    Bird& operator=(Bird& ptak)

    {

      cout << "operator przypisania\n"; 

      name=ptak.name;

    }

};


int Bird::i=0;

Chciałbym jednak, aby w domyślnym konstruktorze, do zmiennej name była doklejona wartość zmiennej i, czyli wynikiem przy tworzeniu nowego obiektu ma być: "Bird#1", przy kolejnych zmienia się tylko numer. Próbowałem tą zmienną jakoś rzutować na napis a potem dołączyć do napisu "Bird#", ale nic mi z tego nie wyszło.


([alex]) #2

Przedstawiona przez 13ty Smok funkcja Str

Wklejasz ta funkcję przed klasą a w konstruktorze:

name="Bird#"+Str(i);

PS.

Ta funkcja potrafi skonwertować na string wszystko co może być wrzucone na cout, nawet:

Bird b; // ta twoja klasa

string s="Mam tu klase Bird o nazwie ("+Str(b)+")";


(Mnemonic) #3

Ok wkleiłem i zrobiłem jak napisałeś, jeszcze za bardzo nie wiem jak to działa, ale to już sobie poszukam.

Problem tylko w tym, że teraz jest zawsze liczba 1 w napisie. A ja tymczasem mam:

Bird obiekt;

  cout << obiekt;

  Bird obiekt2=obiekt;

  cout << obiekt2;

  Bird obiekt3;

  obiekt3=obiekt2;

  cout << obiekt3;

Gdy wypisywałem wcześniej normalnie tą zmienną było ok. Zdaje się, że zmienne statyczne się z tą funkcją za bardzo nie kleją....


([alex]) #4

Niema co się dziwić, zobacz jak zrobiłeś konstruktor kopiujący oraz operator=.

Wg mnie powinno być:

plik bird.h

#include using namespace std;

(Mnemonic) #5

Ja tam się dziwię. To, że nie zastosowałem listy inicjalizacyjnej, a wszystkie funkcje włącznie z przeciążonym operatorem zrobiłem inline, nie znaczy, że od razu jest źle. Chociaż faktycznie zapomniałem dopisać const w argumentach funkcji. Nie rozumiem natomiast po co jest return w definicji operatora<<. Działa mi to tak samo zarówno z tym nim jak i bez niego. Jeśli chodzi o twoje rozwiązanie, to owszem jest dobre, chociaż nie chodziło mi o tworzenie zmiennej przechowującej unikatową wartość, tylko o dodanie wartości statycznej to napisu. W sumie jednak efekt jest ten sam, i póki co musi mi chyba wystarczyć, więc dzięki. Tak szczerze mówiąc to myślałem, że jest może jakaś funkcja lub coś podobnego dla klasy string, ale widzę że jednak nie - szkoda.


([alex]) #6

Nie możesz definiować funkcji w ciele klasy, w ciele klasy możesz definiować tylko metody. Kompilator powinien wywalić błąd, ale możliwe że akurat ten kompilator w ramach rozszerzenia możliwości rozpoznał po klauzule friend że jednak to nie jest metoda. W każdym razie źle nie inline, źle - niezgodność że standardem.

Jeżeli piszesz x=a+b*c; to najpierw się mnoży b \ ***c** , wynik tej operacji dodaje się do wartości a , wynik dodawania wpisuję się do x;

dokładnie tak samo jest w przypadku cout<<"objekt "<

do cout wrzucony zostaje napis, wynikiem tej operacji jest referencja na ten sam cout, do wyniku zostaje wrzucony obj wynikiem powinna być znowu referencja na cout, ponieważ właśnie do wyniku zostanie wrzucony endl;

Jeżeli działa bez tego to jest to szczęśliwy zbieg okoliczności, w rejestrze EAX przypadkiem został adres tego cout.


(Mnemonic) #7

Ok, dzięki za wyjaśnienie : )