Zwracanie przez referencję w metodzie, która przyjmuje w argumentach dwa obiekty

0
#include <iostream>
#include <windows.h>
using namespace std;

class numer;

class zespolona
{
    double rzeczyw;
    double urojon;

public:
    zespolona(double r = 0, double i = 0) : rzeczyw(r), urojon(i)
    {}

    zespolona(numer ob);

    zespolona dodaj(zespolona a, zespolona b)
    {
        zespolona suma;
        suma.rzeczyw = a.rzeczyw + b.rzeczyw;
        suma.urojon = a.urojon + b.urojon;
        return suma;
    }

    friend void pokaz(const zespolona z);
};

void pokaz(const zespolona z)
{
        cout << "Liczba zespolona: [" << z.rzeczyw << ", " << z.urojon << "] \n";
}

class numer
{
    double n;
    string opis;

    friend zespolona::zespolona(numer);

public:
    numer(int k, string t = "bez opisu") : n(k), opis(t)
    {}
};

zespolona::zespolona(numer ob)
{
    rzeczyw = ob.n;
    urojon = 0;
}

int main()
{
    numer num(4, "czworka");
    zespolona z(10,9);
    zespolona w;
    w.dodaj(z,7.5);
    w.dodaj(z,num);
    pokaz(w);

    return 0;
}
 

Jak sprawić aby metoda dodaj zwracała referencję ? Bo mam zwracanie rezultatu przez wartość i potem w metodzie pokaż już nie ma tego obiektu.

0

Zwracanie referencji do obiektów lokalnych funkcji to zło. Wybij sobie taki pomysł z głowy raz na zawsze.

Żeby mieć obiekt, to trzeba go zapamiętać:

zespolona wynik = w.dodaj(z, 7.5);
pokaz(wynik);

Widać po tym przykładzie, że ta funkcja w takiej postaci (przyjmująca 2 parametry) nie powinna być metodą klasy. Nie ma znaczenia czy robisz w.dodaj() czy z.dodaj(), wynik będzie taki sam, bo zależy tylko od parametrów.

0

Jeśli nie powinna być metodą klasy, to powinna być funkcją zaprzyjaźnioną ?

0

Powinna być funkcją zewnętrzną. A to czy zaprzyjaźnioną zależy od tego czy musi być. W tym przypadku tak, bo rzeczyw i urojon są prywatne i bez przyjaźni nie będzie w stanie się do nich dobierać.
Ale gdybyś miał jakiś publiczny interfejs dostępu do tych pól, to wtedy dodaj() może z niego korzystać i nie musi być zaprzyjaźniony.

0

Dlaczego lepiej gdyby ta funkcja była funkcją zewnętrzną ?

1

A po co ma być funkcją składową, skoro nic nie robisz z obiektem, na którym wołasz taką metodę?

1 użytkowników online, w tym zalogowanych: 0, gości: 1