Przeładowany operator wyjścia zwraca adres

0

Nie wiem dlaczego obiekt **test **zwraca mi adres, a nie napis "BMW"


#include <iostream>
#include <fstream>
    using namespace std;
static int object = 0;
class Pojazd {
public:
    Pojazd() { object++; }
    virtual void wypisz(ostream& out) = 0;
    ~Pojazd() { object--; }
};
class Bmw : public Pojazd {
protected:
    string marka;

public:
    Bmw() { object++; }
    Bmw(const string& a1)
        : marka(a1)
    {
    }
    friend ostream& operator<<(ostream& out, const Bmw& ob)
    {
        return out << ob.marka;
    }
    ~Bmw() { object--; }
};

int main()
{

    Pojazd* test = new Bmw("BMW");
    Bmw test2("BMW");

    cout << test << endl;
    cout << test2 << endl;
    return 0;
}

3

W pierwszym przypadku nie zostaje wywołana Twoja wersja operatora.

3

Zmienna test jest typu Pojazd*, podczas gdy Ty przeładowałeś operator dla Bmw& (to, że zmiennej przypisujesz utworzoną instancję klasy Bmw nie ma znaczenia, ponieważ faktyczny typ tej zmiennej to wciąż Pojazd*).

3
Meliodas napisał(a):

Nie wiem dlaczego obiekt **test **zwraca mi adres
bo test jest wskaźnikiem.
Próbuj

Bmw* test2 = new Bmw("BMW");
cout << test2;

i zobacz co dostaniesz.
W tym przypadku możesz wywołać

cout << *test2;

żeby dostać to co chcesz, ale ponieważ test jest typu Pojazd* to taka próba

cout << *test;

skończy się błędem.

2

Operator jest źle zdefiniowany i źle użyty:

ostream& operator<<(ostream& out, const Pojazd& ob)
{
    op.wypisz(out);
    return out;
}

cout << *test << endl;
0

Czy tak zdefiniowana funkcja wirtualna wypisz i operator wyjścia są poprawne (robią to co mają ale czy tak w praktyce się je definiuje ?)
Próbowałem jeszcze tą linijkę

friend ostream& operator << (ostream& out,Bmw& ob)

zastąpić tym friend ostream& operator << (ostream& out,const Bmw& ob)

, bo wydawało mi się, ze nie modyfikuję obiektu. Niestety gdy tak zrobię wyskakuję mi taki komunikat:
main.cpp|23|error: passing 'const Bmw' as 'this' argument of 'virtual std::ostream& Bmw::wypisz(std::ostream&)' discards qualifiers [-fpermissive]|
Jak mam to rozumieć ? :)

```cpp
 
static int object = 0;
class Pojazd{
public:
    Pojazd(){object++;}
    virtual ostream& wypisz(ostream& out)=0;
    ~Pojazd(){object--;}

};

class Bmw:public Pojazd{
protected:
    string marka;
public:
    Bmw(){object++;}
    Bmw(const string& a1):marka(a1){}
    ostream& wypisz(ostream& out){
        return out << marka;
    }
    friend ostream& operator << (ostream& out,Bmw& ob)
    {
       return ob.wypisz(out);

    }
};
3

wypisz według Twojej definicji pracuje na non-const obiekcie.

virtual ostream& wypisz(ostream& out) const=0;
0

Okej, dzięki wszystko śmiga :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1