﻿
#include <iostream>
using namespace std;


class Cat {
private:
    // jeśli pole statyczne jest stałą typu całkowitego, znakowego, wyliczeniowego lub logicznego
    // można je zainicjalozowac w ciele definicji klasy
    const static int max = 20;
public:
    // instance variables - zmienna instancyjna, wymaga istnienia obiektu klasy
    string name;
    // pole statyczne klasy, wspólne dla wszystkich obiektów klasy Cat
    // (class variables - zmienna klasy, nie wymaga istnienia obiektu klasy)
    // inicjalizacja musi być przeprowadzona poza definicją klasy
    // można się do niego odwoływać poprzez obiekt lub klasę
    static int counter;   
    // metoda statyczna moze być zainicjowana wewnatrz definicji klasy,
    // metody statyczne nie mają dostępu do niestatycznych metod i zmiennych,
    // można się do niej odwoływać poprzez obiekt lub klasę
    static int getMax() { return max; };
    // konstruktor, w którym inkrementujemy counter
    // w ten sposób będziemy zliczać powstajace obiekty klasy Cat
    Cat(string i = "") :name(i) {
        counter++;
    };
};

// inicjalizacja pola statycznego musi sie odbyć na zewnatrz definicji klasy
// w zakresie globalnym
int Cat::counter = 0;

int main()
{
    std::cout << "My cats:\n\n";

    // do pola statycznego możemy sie dostać nawet wtedy, 
    // gdy nie ma jeszcze utworzonych obiektów (poprzez nazwę klasy)
    cout << "Mam " << Cat::counter << " kotow" << endl;
   
    cout << "generuję koty: " << endl;
    // tworzymy obiekty klasy Cat
    Cat cat1("marianna");
    // do pola statycznego możemy się również dostać poprzez obiekt klasy
    cout << cat1.counter << ": "<< cat1.name << endl;
    Cat cat2("kicia");
    cout << Cat::counter << ": " << cat2.name<<endl;
    Cat cat3("kocio");
    cout << cat3.counter << ": " << cat3.name << endl;

    for (int i = 0; i < 10; i++)
    {
        Cat cat("noname");
        cout << cat.counter << ": " << cat.name << endl;
    }

    cout << "Teraz mam " << Cat::counter << " kotow" << endl;
    // odwołanie do metody statycznej
    cout << "Max mogę mieć " << Cat::getMax() << " kotow" << endl;
}
