środa, 18 sierpnia 2010

Czas zacząć pisać kod !!!

Ostatnio tylko projektowałem klasy i interfejsy mojego silniczka, teraz trzeba to wszystko wcielić w życie i pisać tysiące linii kodu, cóż takie jest już życie programisty:). Zaczynam od najprostszych elementów, czyli klas pomocniczych. Jedną z nich jest CSAllegroController - "S" w nazwie sugeruje, że jest to klasa typu singleton, 
czyli może istnieć tylko jeden taki obiekt w całym silniku. Klasa jest "nakładką"  na wszelki inicjalizacje i instalacje w Allegro(zawiera tablice w której będą znajdowały się informacje o bieżących zainicjowanych elementach Allegro np. czy zainstalowano obsługę klawiatury, myszki itp.). Klasa, będzie pomocna również, gdy   będziemy chcieli dowiedzieć się jaki interfejsem Allegro posługuje się przy obsłudze plików(podstawowym czy PhysicsFS). CSAllegroController nie trzeba używać na zewnątrz, będzie ona używana tylko wewnątrz silnika.

Jeszcze na temat implementacji w postać singletona:
  • Jest to technika programistyczna pozwalająca na to, że w naszym programie będzie istnieć tylko jeden egzemplarz naszej klasy.
  • Jest to możliwe dzięki statycznemu wskaźnikowi na tę klasę, który jest w niej zawarty, a dostęp do niego uzyskujemy przez statyczną metodę która go zwraca.
Singleton.h
#pragma once
#include
class  Singleton
{
private:
         // statyczny wskaźnik na klasę 
static Singleton * m_Singleton;
public:
static Singleton * GetSingleton();
Singleton();
~Singleton();

};




















// składowe statyczne trzeba deklarować w globalnym obszarze nazw





Singleton * Singleton::m_Singleton;



Singleton SingletonOne; // Tworzymy jedyny obiekt 





Singleton.cpp









#include "Singleton.h"

Singleton::Singleton()
{
        // Sprawdzamy czy nie stworzono już obiektu, czy wskaźnik jest pusty
assert(!m_Singleton);
       // Jeśli tak to inicjujemy go obecnym obiektem
m_Singleton = this;
}


Singleton::~Singleton()
{
        // Sprawdzamy czy obiekt istniej, czy nie jest to pusty wskaźnik
assert(m_Singleton);
       // jeśli nie jest pusty to doprowadzamy go do tego stanu
m_Singleton = 0;
}

static Singleton::Singleton * GetSingleton()
{
        assert(m_Singleton);
        // zwracamy wskaźnik na jedyny obiekt tej klasy
        return m_Singleton;
}


Edit: Słusznie ta implementacja nie jest taka dobra, ale znalazłem lepszą:
http://users.v-lo.krakow.pl/~temporal/SCGame/html/v-lo/arts/inf/singleton.html


Implementacja Scotta Bilasa

1 komentarz:

  1. Błąd. Konstruktor singletonu powinien być zadeklarowany jako prywatny, dzięki czemu mamy pewność, że nie zostanie utworzony więcej niż jeden obiekt. Do tego lepszym rozwiązaniem jest przechowywać statyczny obiekt singletonu w funkcji GetSingletonniż w obiekcie klasy - czym mniej śmieci w klasie tym lepiej a dzięki temu wiemy kiedy będzie obiekt konstruowany(przy pierwszym wywołaniu GetSingleton).
    http://pl.wikisource.org/wiki/Singleton_%28wzorzec_projektowy%29/kod#C.2B.2B - tutaj masz kod o jaki mi chodzi. ;)

    Btw.
    Singleton s2 = *Singleton::GetSingleton();
    I już mamy dwa takie obiekty :P

    OdpowiedzUsuń