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

question-closed Przeciążenie operatora = w C++

Object Storage Arubacloud
0 głosów
632 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez dawid2002 Mądrala (5,190 p.)
zamknięte 4 grudnia 2018 przez dawid2002

Witam, programuje w c++ i ostatnio zajmuje się tematem przeciążenia operatorów w klasie. Napotkałem taki jeden problem, gdy próbowałem napisać funkcje przeciążającą operator = będącą zaprzyjaźnioną z klasą "Klasa".

Dlatego napisałem taki kod:

#include <iostream>

using namespace std;

class Klasa
{
    int wartosc;

public:

      Klasa(int w) : wartosc(w) {}

      friend Klasa operator=(Klasa &obiek1,Klasa &obiek2);

      int zwroc()
      {
          return wartosc;
      }
};

Klasa operator=(Klasa &obiek1,Klasa &obiek2)
{
    return Klasa(obiek1.wartosc = obiek2.wartosc);
}

int main()
{
    Klasa ob1(20) , ob2(30);
    ob1 = ob2;

    cout << ob1.zwroc();
    return 0;
}

Kompilator pokazuje że ten kod nie działa. Nie wiem co źle w nim zrobiłem.

Z góry dziękuje za pomoc!

komentarz zamknięcia: znam już odpowiedź na moje pytanie

2 odpowiedzi

+2 głosów
odpowiedź 1 grudnia 2018 przez PanRik Gaduła (4,510 p.)
wybrane 3 grudnia 2018 przez dawid2002
 
Najlepsza

1. Po co Ci zaprzyjaźniać ten operator?

2. Operator przypisania przyjmuje tylko jeden argument, no bo jak dwa? 
 

Klasa a(5);
Klasa b(6);
a = b;

W tym momencie zostanie wywołany operator przypisania na obiekcie a.
W funkcji przeciążającej do obiektu odwoływalibyśmy się poprzez this, a do obiektu poprzez argument.
 

3. 

return Klasa(obiek1.wartosc = obiek2.wartosc);

Co ma robić ta linijka? 
Jeżeli chcesz przypisać wartości z obiek1 do obiek2. To w tym wypadku w funkcji przeciążającej robisz coś typu:
 

Klasa & Klasa::operator =( Klasa &obiek )
{
    this.wartosc = obiek.wartosc;
    return *this;
}

 

komentarz 1 grudnia 2018 przez dawid2002 Mądrala (5,190 p.)

Dzięki za odpowiedź!

Generalnie jeśli chodzi o zaprzyjaźnianie to przeglądając kilka stron widziałem że jest przeciążanie gdzie ich ciało jest od razu w klasie lub przeciążanie gdzie jest zaprzyjaźnianie w klasie , a ciało tej funkcji poza klasą.

Na jednej z tych stron jest na końcu tabelka mówiąca ile mają funkcje przeciążone parametrów w zależność od sposobu w jakim się je wykonało.

Dlatego właśnie u mnie są dwa parametry a nie jeden parametr jak u ciebie.

link do strony z tabelką: http://cpp0x.pl/artykuly/?id=15

komentarz 1 grudnia 2018 przez PanRik Gaduła (4,510 p.)
Też nie jestem wszystko wiedzący, jak się dowiesz co i dlaczego to chętnie się dowiem , po co się zaprzyjaźnia operatory i daje się dwa argumenty w operatorze= :D
1
komentarz 1 grudnia 2018 przez monika90 Pasjonat (22,940 p.)
przeciążony operator = musi być funkcją składową klasy.
komentarz 2 grudnia 2018 przez dawid2002 Mądrala (5,190 p.)

No dobra czyli operator = musi być koniecznie funkcją składową klasy.

W takim razie nie może on być zaprzyjaźniony z klasą.

A czy są jeszcze operatory które też tak mają? (pytam się dla pewności)

komentarz 2 grudnia 2018 przez monika90 Pasjonat (22,940 p.)
Operatory ()  []  -> też muszą być funkcjami składowymi klasy.
komentarz 3 grudnia 2018 przez dawid2002 Mądrala (5,190 p.)
Dzięki teraz już wszystko jasne
+1 głos
odpowiedź 1 grudnia 2018 przez RafalS VIP (122,820 p.)

@PanRik już rozwiązał problem to ja dorzuce czemu w żadnym przypadku nie ma sensu zaprzyjaźnienia funkcji / operatora w sytuacji gdy chcemy mieć dostęp do prywatnych pól obiektu tej samej klasy przekazanego jako argument:

#include <iostream>
using namespace std;

class A {
public:
	A(int x) : x(x) {}
	void access_test(const A& a) {
		//masz dostep do prywatnego pola x obiektu a
		//bo jestesmy w tej samej klasie
		cout << a.x << endl;
	}
private:
	int x;
};
int main() {
	A a(2);
	A b(10);
	b.access_test(a);
}

 

Podobne pytania

0 głosów
1 odpowiedź 241 wizyt
0 głosów
1 odpowiedź 113 wizyt
pytanie zadane 14 marca 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
1 odpowiedź 613 wizyt
pytanie zadane 3 listopada 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...