• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Nie działa przeciążenie operatora

Object Storage Arubacloud
0 głosów
394 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez kacper1445 Gaduła (4,880 p.)

Stworzyłem przeciążenie operatora '>>' dla klasy Mother:

istream& operator>> (istream &stream)
    {
        Mother _in(x,y);

        for(int i=0;i<y;i++)
            for(int k=0;k<x;k++)
                stream>>_in.tab[i][k];

        return stream;
    }

Oraz chciałem go zastosować: 

Mother test(2,3);
cin>>test;

Niestety z niewiadomych powodów wyskakuje mi błąd przy cin>>test;

error: no match for 'operator>>' (operand types are 'std::istream {aka std::basic_istream<char>}' and 'Mother')|
|
 

1 odpowiedź

0 głosów
odpowiedź 1 kwietnia 2020 przez tangarr Mędrzec (154,780 p.)

Musisz napisać operator >> zaprzyjaźniony z twoją klasą

 friend istream& operator>> (istream &stream, Mother &_in)

 

komentarz 1 kwietnia 2020 przez kacper1445 Gaduła (4,880 p.)
Nawet jeżeli zdeklarowałem przeciążenie w tejże klasie?
komentarz 1 kwietnia 2020 przez tangarr Mędrzec (154,780 p.)

Tak, jeżeli chcesz używać używać operatora w sposób, który napisałeś.

Twój operator należy użyć inaczej

Mother test(2,3);
test >> cin;

Tylko nie wiem czy operator nie powinien zwracać referencji na obiekt Mother.
Ponadto twój operator ma błąd. Dane zostaną wczytane do tymczasowej zmiennej _in a nie twojej instancji test.

komentarz 2 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

Tylko nie wiem czy operator nie powinien zwracać referencji na obiekt Mother.

Nie powinien. Powinien zwrócić strumień.

komentarz 2 kwietnia 2020 przez tangarr Mędrzec (154,780 p.)
edycja 2 kwietnia 2020 przez tangarr

Ale czy w przypadku zdefiniowania operatora odczytu wewnątrz klasy nie staje się ona strumieniem?

class MyClass {
public:
    MyClass &operator >> (JakisObiekt &);
}

Edit:
Przy aktualnym kodzie zapis:

Mother test(2,3);
int liczba;
test >> cin >> liczba;

Spowoduje:
- wykonanie operatora istream& Mother::operator>> (istream &)
- a potem operator istream& istream::operator>> (int &)

komentarz 2 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
Operatory wejścia/wyjścia definiuje się jako funkcje dwuargumentowe (zaprzyjaźnione, jeśli trzeba).

Ten jednoargumentowy operator definiujesz raczej wtedy, gdy chcesz zaimplementować operator przesunięcia lub coś w tym stylu.
1
komentarz 2 kwietnia 2020 przez tangarr Mędrzec (154,780 p.)

Dla zabawy przygotowałem test:

#include <iostream>

using namespace std;

class MyStream {
private:
    int mCounter = 0;
public:
    MyStream &operator >> (int &output) {
        output = mCounter++;
        return *this;
    }
};

class CrazyStream {
public:
    int mNumber = 0;
    istream &operator >> (istream &input) {
        input >> mNumber;
        return input;
    }
};

int main()
{
    int a,b,c;
    MyStream myStream;
    myStream >> a >> b >> c;
    cout << a << " " << b << " " << c << endl;
    
    int x;
    CrazyStream crazyStream;
    crazyStream >> cin >> x;
    
    cout << crazyStream.mNumber << " " << x << endl;

    return 0;
}

Kod działa tak jak się spodziewałem.

Operator >> zdefiniowany wewnątrz klasy MyStream powoduje, że klasa staje się pełnoprawnym strumieniem odczytu.

Operator >> zdefiniowany w klasie CrazyStream działa tak, jak operator >> w klasie kacpra1445.

Podobne pytania

+1 głos
1 odpowiedź 543 wizyt
pytanie zadane 19 czerwca 2021 w C i C++ przez wndtcw Nowicjusz (130 p.)
+1 głos
2 odpowiedzi 317 wizyt
pytanie zadane 14 czerwca 2021 w C# przez everstudybee Użytkownik (610 p.)
0 głosów
1 odpowiedź 241 wizyt

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,920 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...