Przeładowany operator wyjścia zwraca adres

Przeładowany operator wyjścia zwraca adres
ME
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

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

Kopiuj

#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;
}

szweszwe
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1694
3

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

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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*).

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
3
Meliodas napisał(a):

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

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

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

Kopiuj
cout << *test2;

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

Kopiuj
cout << *test;

skończy się błędem.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
2

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

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

cout << *test << endl;
ME
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
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ę

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

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

Kopiuj
, 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);

    }
};
kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
3

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

Kopiuj
virtual ostream& wypisz(ostream& out) const=0;
ME
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Okej, dzięki wszystko śmiga :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.