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

question-closed Przeciążanie operatora jednoargumentowego

VPS Starter Arubacloud
0 głosów
533 wizyt
pytanie zadane 22 maja 2017 w C i C++ przez naryans Nowicjusz (140 p.)
zamknięte 22 maja 2017 przez naryans

Witam,

Mam pewien problem ze zrozumieniem pewniej rzeczy. Otóż przeciążyłem argument jednoargumentowy:

Zespolona operator- ();
Zespolona Zespolona::operator- ()
{
	return Zespolona(-this->re, -this->im);
	
}

I gdy stworzą obiekt z1, a następnie chciałbym zmienić wartość liczby na ujemną tym sposobem nie działa:

//stworzenie obiektu z1;

-z1; 
std::cout  <<  z1;

std::cout << -z1 // <---- tym sposobem dziala

Wydaję mi się, że to przez to iż funkcja nie działa na oryginalnym obiekcie. W jaki sposób można sprawić, że ten sposób zadziała? O ile w ogóle można. :)

komentarz zamknięcia: Uzyskałem odpowiedź. :)

2 odpowiedzi

+1 głos
odpowiedź 22 maja 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
To trochę bez sensu, żeby -z1; zmieniało stan obiektu, ale jeżeli jest Ci to bardzo potrzebne, to zmień w przeciążającej funkcji wartość pól i zwróć referencję do obiektu na którym operujesz (this). Wstawiłbym kod, ale piszę z telefonu ;)
1
komentarz 22 maja 2017 przez niezalogowany

To by wyglądało tak:

void Zespolona::operator- ()
{
    this->re = -this->re;
    this->im = -this->im;
}

Od razu działanie na oryginale, a nie zwracanie nowego obiektu, który nie zostanie przypisany. Ewentualnie zamiast tego przeciąż operator *= i wtedy rób z1*=-1.

komentarz 22 maja 2017 przez naryans Nowicjusz (140 p.)

Dziękuję bardzo :)
 

Zespolona Zespolona::operator- ()
{
	return (this->re = -this->re,
		this->im = -this->im);
	
}

 

+1 głos
odpowiedź 22 maja 2017 przez Bondrusiek Maniak (61,370 p.)

Witam,

przeanalizuj ten przykład. Powinno pomóc. Jeśli coś będzie niejasne to pytaj

#include <iostream>
#include <ostream>

using namespace std;

class Complex
{
public:
    Complex(float re, float im) : realis(im), imagis(im) {}
    Complex& operator -();
    friend ostream& operator<<(ostream& stream, const Complex&);
private:
    float realis;
    float imagis;
};

Complex& Complex::operator -()
{
    realis = -realis;
    imagis = -imagis;
    return *this;
}

ostream& operator <<(ostream& stream, const Complex & c)
{
    stream << "Re :" << c.realis << " Im :" << c.imagis << endl;
    return stream;
}

int main(int argc, char *argv[])
{
    Complex com(10.,10.);
    cout << com;
    cout << -com;
    return 0;
}

 

komentarz 22 maja 2017 przez naryans Nowicjusz (140 p.)

Próbowałem zrobić w ten właśnie sposób, tylko że bez 

realis = -realis;
imagis = -imagis;

lecz próbując w ten sposób:

return *(this->.....); 

I w sumie nie do końca wiem czemu kompilator tego nie przyjmował.Oczywiscie  tak samo przeciazylem operator

Complex& operator -(); 

 

A można jeszcze spytać gdzie popełaniam błąd? (chociaz wydaje mi sie ze niepotrzebnie kombinuje) 

Zespolona Zespolona::operator+ (const Zespolona &a)
{
	/*Zespolona temp;
	temp.re = this->re + a.re;
	temp.im = this->im + a.im;
	return temp;*/
	return (this->re = this->re + a.re,
		this->im = this->im + a.im);
}

Kompilator przyjmuje ale niestety źle zwraca wynik. 

komentarz 22 maja 2017 przez Bondrusiek Maniak (61,370 p.)

Coś nie rozumiem, co chcesz zwrócić return *(this->.....); : klasę Zespolone, elementy pól ?

komentarz 22 maja 2017 przez naryans Nowicjusz (140 p.)
edycja 22 maja 2017 przez naryans

return *(-this->re, -this->im) w ten oto sposób to zadeklarowałem. 

edit: Chociaż to co tutaj wypisałem nie ma sensu jednak.. :) 

1
komentarz 22 maja 2017 przez Bondrusiek Maniak (61,370 p.)

Hej

Zespolona Zespolona::operator+ (const Zespolona &a)
{
    /*Zespolona temp;
    temp.re = this->re + a.re;
    temp.im = this->im + a.im;
    return temp;*/
    return (this->re = this->re + a.re,
        this->im = this->im + a.im);
}

Zauważ co w tym przypadku zwracasz:

return (this->re = this->re + a.re, this->im = this->im + a.im);

A w deklaracji jest Zespolona. Zespolona != (this->re = this->re + a.re, this->im = this->im + a.im); . Typ zwrócony musi być taki sam jak w deklaracji metody;

Popraw na :

Zespolona Zespolona::operator+ (const Zespolona &a)
{
    return Zespolona(re + a.re, im + a.im);
}

 

komentarz 22 maja 2017 przez naryans Nowicjusz (140 p.)
Cholera, święta racja. Rozumiem to rozwiązanie, i w sumie też zastosowałem. Po prostu wypadło z głowy.. :) Dziękuję za pomoc wszystkim.

Podobne pytania

+1 głos
1 odpowiedź 175 wizyt
pytanie zadane 19 kwietnia 2018 w C i C++ przez paweto Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 348 wizyt
0 głosów
1 odpowiedź 216 wizyt
pytanie zadane 13 grudnia 2017 w C i C++ przez Zaaa Nowicjusz (160 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...