Funkcje++

więcej funkcji!

Posted by Mrozo on April 11, 2015

Przeciążane funkcji

Przeciążona funkcja może przyjmować różne argumenty i w zależności od nich zwracać inne wartości:

void funkcja(int x)
{
    //kod
}

void funkcja(string x)
{
    //kod
}

void funkcja(int x, string y)
{
    //kod
}

funkcja(5);
funkcja("tekst");
funkcja(10, "tekst");

Jak widzisz powyżej mamy przeciążoną funkcję. Mimo tej samej nazwy funkcja ta może różnie się zachowywać.

Funkcje zaprzyjaźnione

W niektórych przypadkach chcielibyśmy aby funkcja znajdująca się poza klasą miała dostęp do jej danych (nawet tych prywatnych)

Funkcja zaprzyjaźniona może być przyjacielem więcej niż jednej klasy.

Po co te całe przyjaźnie? Załóżmy, że chcemy napisać prosty mechanizm walki w grze 2D. Jeżeli tekstura (to co widzimy w grze jako miecz) naszego miecza pokryje się z teksturą przeciwnika będzie to oznaczało, że trafiliśmy i zadajemy obrażenia. Jak tego dokonać? Możemy stworzyć funkcję, która będzie sprawdzała czy współrzędne tekstury miecza (dane w jednej klasie) nachodzą na współrzędne tekstury przeciwnika (dane w innej klasie). Oczywiście taka funkcja będzie musiała mieć dostęp do tych informacji.

Zawsze klasa deklaruje kto jest jej przyjacielem bo to ona udostępnia innym swoje dane. Nie ma tak, że jakaś funkcja powie sobie, że ma samych przyjaciół co mogłoby być kłamstwem ponieważ klasy by jej nie znały i nie pozwalały korzystać ze swoich prywatnych skarbów ;)

class Klasa1
{
  //kod
public:
  friend void funkcjaZaprzyjazniona(Klasa1 x, Klasa2 y);
};

class Klasa2
{
  //kod
public:
  friend void funkcjaZaprzyjazniona(Klasa1 x, Klasa2 y);
};

void funkcjaZaprzyjazniona(Klasa1 x, Klasa2 y)
{
  cos = x.zmienna_z_klasy_1 + y.zmienna_z_klasy_2 //mamy dostęp do zmiennych prywatnych z klas!
}

Oprócz funkcji możemy również przyjaźnić ze sobą klasy :D ale o tym kiedy indziej ;)