2010-07-23 16 views
6

Dlaczego należy przeładowywać operatorów strumieni (< <, >>), aby pozostać przyjaciółmi, a nie członkami klasy?Przeciążenie operatora strumienia

+3

To sprawia, że ​​programowanie jest o wiele bardziej ekscytujące, gdy funkcje mają romans z prywatnymi członkami twoich zajęć. – zneak

Odpowiedz

9

Po przeciążeniu operatora binarnego jako funkcji składowej klasy przeciążenie jest używane, gdy argument pierwszy jest typu klasy.

Dla operatorów strumieniowych pierwszym operandem jest strumień, a nie (zwykle) klasa niestandardowa.

Z tego powodu przeciążone operatory strumieni dla niestandardowych klas, które są przeznaczone do używania w tradycyjny sposób, nie mogą być funkcjami składowymi klasy niestandardowej, muszą być funkcjami bezpłatnymi.

(Zakładam, że klasy strumieni nie są otwarte do zmiany, gdyby można było dodać funkcje członkowskie do strumieniowania klas, aby poradzić sobie z dodatkowymi typami niestandardowymi, ale zazwyczaj nie jest to pożądane z punktu widzenia zależności.)

To, czy są przyjaciółmi, czy też nie, zależy od tego, czy potrzebują dostępu do niepublicznych członków klasy.

+0

Myślę, że to trochę mylące. Mogą * mogą * być funkcjami członkowskimi, ale aby używać ich w zwykły sposób (zapis do strumieni), muszą być funkcjami członkowskimi. –

+0

@sztomi: Nie rozumiem twojego komentarza. Nie, oni nie muszą być członkami funkcji; nie mogą być funkcjami członkowskimi (chyba, że ​​piszesz klasę strumieniową lub piszesz operatory strumieniowe wstecz od reszty świata). –

+0

Więc tak, mogą to być funkcje członkowskie. Jeśli chcesz, aby działały jak zwykle (tak jak używa tego inne słowo), musisz zdefiniować je jako przyjaciół. O to mi chodziło. –

0

Członkowie jakiej klasy? Jaki jest typ lewego argumentu?

Nie muszą one być jednak friend, chyba że istnieje potrzeba uzyskania dostępu do niedostępnych w inny sposób danych prywatnych.

2

Więc można powiedzieć:

some_stream << my_class; 

Należy zauważyć, że definicja podmiotów członkowskich sprawia, że ​​skrzydła opuścił samodzielne klasy to. np .:

my_class << some_stream; 

co nie jest jak standardowe strumienie mają pracować.

Powiązane problemy