Przeładowanie operatorów dwuargumentowych wg Symfonii C++

Przeładowanie operatorów dwuargumentowych wg Symfonii C++
T2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0

Czytając Symfonię, natknąłem się na paragraf w którym jest napisane:

Operatory dwuargumentowe możemy także przeładowywać na dwa sposoby:

  • albo jako funkcję składową niestatyczną wywołaną z jednym argumentem x.operator@(y)
  • albo jako funkcję nie-składową (czyli zwykłą), wywoływaną z dwoma argumentami. operator@(x,y)
    Taka funkcja operatorowa zostaje automatycznie wywołana, gdy obok znaczka danego operatora znajdą się dwa argumenty określonego przez nas typu.

A co jeśli tymi dwoma argumentami są obiekty danej klasy ? Wtedy przecież funkcja nie-składowa musi chyba mieć dwa argumenty wywołania funkcji ?

dodanie znacznika <quote> - @furious programming

edytowany 1x, ostatnio: flowCRANE
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
0

W przypadku definicji operatora dwuargumentowego wewnątrz klasy, pierwszym argumentem jest *this.

Nie rozumiem trochę jaką masz wątpliwość. Jeżeli operator ma mieć dwa argumenty, a definiując funkcję wewnątrz klasy podajesz tylko jeden (prawy), to chyba naturalne, że tym drugim (lewym) będzie obiekt tej klasy wewnątrz której właśnie jesteś. No bo co innego mogłoby być?


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju
T2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0

Jeśli mam klase zespolona to jeśli w argumentach funkcji mam dwa argumenty typu zespolona to w deklaracji metody w klasie muszę podać dwa, a nie jeden argument.

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

Można te funkcję umieścić poza klasą, ale jakby była ona w klasie to musi mieć dwa argumenty, a nie jeden.

Endrju
Pokaż kod o którym mówisz.
flowCRANE
@tadzik287 - w takich przypadkach edytuj swoje posty, dodając brakujące informacje, zamiast tworzyć nowych postów;
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
1

Spójrz na ten kod: http://ideone.com/D7E2KE

Tak wygląda operator w środku:

Kopiuj
  OperatorInside operator+(const OperatorInside &rhs) {
    const OperatorInside sum(a + rhs.a);
    return sum;
  }

A tak na zewnątrz:

Kopiuj
OperatorOutside operator+(const OperatorOutside &lhs,
                          const OperatorOutside &rhs) {
 
  const OperatorOutside sum(lhs.a + rhs.a);
  return sum;                  	
}

Operator dwuargumentowy wewnątrz klasy nawet nie może mieć więcej niż jedngo argumentu (skończy się to błędem kompilacji).


"(...) otherwise, the behavior is undefined".
edytowany 2x, ostatnio: Endrju
T2
czyli jeśli bym miał taki operator który napisałem to trzeba go pisać na zewnątrz klasy ?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.