// ------------------------
// Deklaracja klasy
// ------------------------
class CTest : public CBase
{
    public:
        // Konstruktory dwufazowe
        static CTest* NewL();
        static CTest* NewLC();
        
        // Destruktor musi by publiczny, aby mona byo
        // usun utworzone obiekty.
        virtual ~CTest();
        
    public:
        // Metody klasy
        
    protected:
        // Konstruktor domylny nie moe by publiczny.
        // Pierwsza faza konstrukcji
        CTest();
        // Druga faza konstrukcji
        void ConstructL();
        
    private:
        // Pola klasy
};

// ------------------------
// Definicja klasy
// ------------------------
CTest* CTest::NewL()
{
    // Wywoujemy dwufazowy konstruktor NewLC, ktry
    // tworzy obiekt, ale nie zdejmuje go z CleanupStack.
    CTest* self = CTest::NewLC();
    // Konstruktor NewLC wykona si bez generowania wyjcia
    // - moemy zdj wskanik z CleanupStack.
    CleanupStack::Pop( self );
    return self;
}

CTest* CTest::NewLC()
{
    // Tworzymy obiekt w standardowy sposb.
    // Pierwsza faza konstrukcji
    CTest* self = new( ELeave ) CTest();
    // Przed wykonaniem drugiej fazy konstrukcji, musimy
    // zabezpieczy wskanik przed potencjalnym wyjciem.
    CleanupStack::PushL( self );
    // Druga faza konstrukcji
    self->ConstructL();
    // Zwracamy wskanik do obiektu bez zdejmowania go
    // z CleanupStack.
    return self;
}

CTest::CTest()
{
    // Tutaj wykonujemy kod inicjalizacyjny, ktry
    // nie moe wygenerowa wyjcia.
}

CTest::~CTest()
{
    // ...
}

void CTest::ConstructL()
{
    // Tutaj wykonywany jest kod, ktry moe
    // wygenerowa wyjcie.
}

// ------------------------
// Uycie konstruktorw dwufazowych
// ------------------------

// Uycie konstruktora NewL
CTest* test1 = CTest::NewL();
// Operacje...
// Jeeli istnieje moliwo nastpienia wyjcia, naley
// pamita, aby odoy wskanik test1 na CleanupStack.
delete test1;

// Uycie konstruktora NewLC
CTest* test2 = CTest::NewLC();
// Operacje, w tym rwnie te, ktre mog wygenerowa
// wyjcie.
CleanupStack::PopAndDestroy( test2 );
