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

question-closed Przeciążenie operatora >>

0 głosów
1,339 wizyt
pytanie zadane 26 lipca 2017 w C i C++ przez WireNess Stary wyjadacz (11,250 p.)
zamknięte 26 lipca 2017 przez WireNess

Cześć

Od kilku godzin głowie się nad stworzeniem przeciążenia operatora >>.

Mam klasę o nazwie, załóżmy klasa, który ma dwie składowe: x,y.

W funkcji main tworzę obiekt klasy o nazwie - object. I teraz chciałbym za pomocą instrukcji cin>>object; wczytać składowe x,y

I za nic nie mogę wymyślić jak to zrobić ;D 

Wycinki potrzebnego kodu:

mojaKlasa.hpp

class Klasa
{
private:
    double x;
    double y;

public:
    Klasa();
    ~Klasa();
};

mojaKlasa.cpp

Klasa::Klasa()
{
    x=y=0;
}
Klasa::~Klasa()
{
}

main.cpp

Klasa object;

cout << "Podaj liczbe zespolona: " << endl;
cin >> object;

Wiem, że to ^^^^^^^^^^^^^^^^^ i tak nic nie pomoże, ale chcę uniknąć krytyki ludzi typu: ,,może byś podał kod?",,tu są programiści nie jasnowidzowie" etc.

Nie ma potrzeby dawania całego kodu, bo i tak nic by to nie dało :D.

Wracając do pytania:

Próbowałem coś takiego:

//mojaKlasa.hpp

void operator>>(const istream & is, const Klasa & kl) const;
//mojaKlasa.cpp

void operator>>(const istream & is, const Klasa & kl) const
{
    cout << "x: ";
    cin >> kl.x;
    cout << "y: ";
    cin >> kl.y;
}

Ale nie wypaliło ;D

 

Jeżeli brakowałoby jakiejkolwiek informacji potrzebnej do rozwiązania problemu, nie krytykuj - napisz - uzupełnie!

komentarz zamknięcia: Rozwiązany!

1 odpowiedź

+3 głosów
odpowiedź 26 lipca 2017 przez Bondrusiek Maniak (61,440 p.)
wybrane 26 lipca 2017 przez WireNess
 
Najlepsza

Witam,

spróbuj tak w pliku .hpp

friend istream& operator>>(istream & is, Klasa & kl) 
{
is >> kl.x >> kl.y;
return is; 
}

  1. 1)Dodajemy modyfikator firend aby obiekt mógł być po lewej stronie wyrażenia bądź by funkcja mogła odwołać się do pól prywatnych.
  2. 2)Operator >> przeważnie powinien coś zwrócić. Domyślnie jest to istream& i wtedy możliwy jest taki zapis cin >> klasa.
  3. 3)Usuń z sygnatury funkcji słowo const. Modyfikator const zabrania zmieniać wartości a Ty w tej funkcji podajesz nową zawartość dla is oraz pol klasy kl.

Pozdrawiam

komentarz 26 lipca 2017 przez WireNess Stary wyjadacz (11,250 p.)

​​​​​​Dzięki wielkie!

I jeszcze większe dzięki za wytłumaczenie! :D

Pozdrawiam!

​​​​

​​​​​

komentarz 26 lipca 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)

Bondrusiek, jak żyję, nigdy nie widziałem, żeby w C++ można było używać słowa kluczowego "friend" poza klasą, poza tym narusza to bezpieczeństwo klas. Powiesz mi skąd o tym się dowiedziałeś i/lub dasz jakiś kod, który to wykorzystuje i działa?

komentarz 26 lipca 2017 przez Bondrusiek Maniak (61,440 p.)

@PoetaKodu Napisałem aby ten kody wykorzystał w pliku.h(domyślnie w definicji klasy)
 

class Klasa

{

...

friend void jakasKlasa() {//jakiś kod}

};

Słowo friend używasz tylko w definicji klasy. Mówi to kompilatorowi, że ta funkcja może się odwoływać do zmiennych prywatnych. Modyfikator friend z mojego doświadczenia wiem że najczęściej jest wykorzystywany przy przeciążeniu operatorów klasy.

komentarz 26 lipca 2017 przez WireNess Stary wyjadacz (11,250 p.)

Napisał, żeby użyć w pliku .hpp!

Czytaj dokładniej?!

komentarz 26 lipca 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
Edit: nevermind, mój błąd.

Podobne pytania

+1 głos
2 odpowiedzi 591 wizyt
pytanie zadane 14 czerwca 2021 w C# przez everstudybee Użytkownik (670 p.)
0 głosów
2 odpowiedzi 1,412 wizyt
pytanie zadane 6 stycznia 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)

93,766 zapytań

142,722 odpowiedzi

323,373 komentarzy

63,360 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...