• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
506 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez kacper1445 Mądrala (5,050 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 (155,140 p.)

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

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

 

komentarz 1 kwietnia 2020 przez kacper1445 Mądrala (5,050 p.)
Nawet jeżeli zdeklarowałem przeciążenie w tejże klasie?
komentarz 1 kwietnia 2020 przez tangarr Mędrzec (155,140 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 (195,220 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 (155,140 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 (195,220 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 (155,140 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ź 736 wizyt
pytanie zadane 19 czerwca 2021 w C i C++ przez wndtcw Nowicjusz (130 p.)
+1 głos
2 odpowiedzi 376 wizyt
pytanie zadane 14 czerwca 2021 w C# przez everstudybee Użytkownik (670 p.)
0 głosów
1 odpowiedź 255 wizyt

93,106 zapytań

142,082 odpowiedzi

321,605 komentarzy

62,447 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...