﻿

#include <iostream>
using namespace std;

// deklaracja klasy Portfel
class Portfel;

class Przyjaciel {
public:
    void pozyczKase(Portfel& portfel);
};


class Portfel {
private:
    int kasa;
public:
    // konstrultor domyślny
    Portfel() :kasa(1000) {};
    // deklaracja funkcji zaprzyjaźnionej z klasą Portfel
    // (to nie jest metoda klasy Portfel)
    // funkcja zaprzyjaźniona z klasą Portfel :
    // ma dostęp do prywatnych i chronionych członków klasy Portfel,
    // deklaracja może być umieszczona w dowolnym miejscu klasy(nawet private),
    // parametrem jest obiekt klasy Portfel przekazywany do funkcji przez referencję(wewnątrz funkcji zmieniamy stan obiektu),
    // funkcja zaprzyjaźniona może być przyjacielem kilku klas jednocześnie
    // rozszerza mechanizm hermetyzacji(ukrywania danych)
    friend void Przyjaciel::pozyczKase(Portfel& portfel);
    void pokazKase() { cout << kasa; };
};


int main()
{
    cout << "Pożyczka dla przyjaciela\n\n";
    Portfel portfel;
    Przyjaciel przyjaciel;
    // wywołanie funkcji zaprzyjaźnionej
    przyjaciel.pozyczKase(portfel);
    cout << "w portfelu zostało: ";
    portfel.pokazKase();
}

// definicja funkcji zaprzyjaźnionej
void Przyjaciel::pozyczKase(Portfel& p)
{
    //funkcja zaprzyjaźniona operuje na prywatnym polu kasa klasy Portfel 
    cout << "masz w portfelu : " << p.kasa << endl;
    cout << "pożyczam 100 zł" << endl;  
    p.kasa -= 100;
    cout << "dzieki!" << endl;
}


