#include <iostream>
using namespace std;

const int DAYS = 0x08;

class Date
{
private:
	uint8_t day, month, year;
	static int anzahl;  // Klassenvariable

    uint8_t bcdToUint(uint8_t const nybbles);
public:
	Date():day(1), month(1), year(00)   // Initialisierungsliste mit konstante Parameterwerten
	{anzahl++;}
	// Initialisierungsliste über parametrisierten Konstruktor
	Date(uint8_t _day, uint8_t _month, uint8_t _year):day(_day), month(_month), year(_year)
	{  // entspircht:  day = _day; ....
		anzahl++;			// Klassenvariable erhöhen
	}
	~Date() {				// Destruktor
		printf("Good bye\n");
		anzahl--;			// Klassenvariable erniedrigen
	}			
    uint8_t GetDay();		// Methode
    static int GetAnzahl()	// statische Methode
    {
    	return anzahl;
    }
};

uint8_t Date::bcdToUint(uint8_t const nybbles)
{
    day = (nybbles>>4)*10 + (nybbles & 0x0F);
    return day;
}
uint8_t Date::GetDay()
{
    //return bcdToUint(day & 0x3F);
    return day;
}

int Date :: anzahl = 0;	// statische Variable mit 0 initiallisieren

int main()
{
	Date date1;				// Instanziierung mit Standard Konstruktor und 
	Date date2(18,4,15);  	// mit parametrisierten Konstruktor

	printf("\n\t\tStatische Member Test\n\n");
	printf("Anzahl der Objekte: %d\n", Date::GetAnzahl());	// Zugriff auf stat. Methode über Klassenname
	printf("Anzahl der Objekte: %d\n", date1.GetAnzahl());	// Zugriff auf stat. Methode über Objektvariable
	//printf("Day 1: %d\n", date1.GetDay());
	//printf("Day 2: %d\n", date2.GetDay());
  return 0;
}
