/* A következõ két sor és az utolsó arra kell, hogy ha véletlenül kétszer include-olnám ezt a fájlt, akkor se
legyen gond. Pl include-olom ezt a header-t és egy olyan header-t is, ami include-olja ezt fájlt...
Ezeket általában legenerálja a CodeBlocks*/
#ifndef KULONCUCCOK_H_INCLUDED
#define KULONCUCCOK_H_INCLUDED

/// FONTOS! Nem includoljuk innen a kuloncuccok.cpp-t, azt megtalálja magától is a fordító, ha hozzá van adva a projekthez
/// SŐT, általában véve tilos cpp fájlokat include-olni.
/*Ennek oka az, hogy a preprocesszor (fordítóprogram első alprogramja) az #include <valami> soroknál bemásolja
az adott fájl tartalmát az #include sor helyére. Viszont ennek a header-ös dolognak pont az lenne a lényege,
hogy a cpp fájlokat egymástól függetlenül lefordítja a program, így ha az egyiket módosítom, akkor nem kell a
többit is újrafordítani. Emiatt jelentősen fog csökkenni a programom fordítási (NEM futási!!) ideje, ami egy
nagy projektnél nem hátrány...
*/

/// Ebbe a fájlba nem írok konkrét kódot, csak a szignatúrát, vagyis, hogy hogyan kell meghívni az egyes függvényeket,
/// és hogy milyen mezõi lesznek a struct-nak.

struct egysegVektor
{
private:
    double x, y;
    /* Ez a good() egy olyan függvény, amit a main-ből nem lehet majd meghívni.
    Ezt azért csinálom, hogy védjem magam, és a későbbi felhasználót attól, hogy úgy használja ezt a struct-ot,
    ami nem rendeltetésszerű. (Másképp: le tudom korlátozni a felhasználás módját, és a lekorlátozott eseteket
    le tudom jobban kezelni. - Olyan ez, amint amikor lekorlátozom a felhasználót, hogy csak számokat tartalmazó
    fájlokat adhat meg bemeneti fájlként.)*/
    bool good();
public:
    double length();

    /// Ez a konstruktor, ami egy olyan függvény, ami akkor fut le, amikor létrehozok egy egyegVektor típusú változót.
    /// pl.: egysegVektor v(5,6);
    /*FONTOS! Lehet többféle konstruktort is csinálni (különböző paraméterlistával), viszont ha egyet is létrehozok,
    akkor megszűnik az alapértelmezett, így ezentúl nem tudok így létrehozni egysegVektort: "egysegVektor v;",
    csak akkor, ha csinálok egy üres paraméterlistájú konstruktort: egysegVektor();*/
    egysegVektor(double x,double y);

    /// Mivel a main-ből és a kiir függvényből nem látom az x és y mezőket, ezért kell függvényeket írnom, hogy elérjem őket.
    /*Így most hülyeségnek tûnhet, hogy miért hozok létre függvényt erre, elég lenne, ha x és y simán public lenne.
    Viszont általában azt szoktuk mondani, hogy a struct-ok mezõi legyenek rejtettek, vagyis legyenek private-ok
    és csak függvényen keresztül lehessen állítani és lekérdezni őket. Ennek akkor van igazán értelme,
    ha szeretnénk ellenőrizni, hogy milyen értéket vesznek fel a mezők. Pl Ebben a példában olyan vektorokkal
    kéne dolgoznom, amiknek 1 a hossza, így a függvény, amivel be tudom állítani az x és y értékeket, tud szólni,
    ha hibás értéket próbálok megadni. */
    double getX();
    double getY();
    void setValue(double _x, double y);
};

/// Nem csak struct-ot rakhatok külön fájlba, hanem függvényeket is...
void kiir(egysegVektor v);

#endif // KULONCUCCOK_H_INCLUDED
