class COsoba : public CBase
{
    public:
        // Konstruktory dwufazowe
        static COsoba* NewL( const TDesC& aImie, const TDesC& aNazwisko );
        static COsoba* NewLC( const TDesC& aImie, const TDesC& aNazwisko );
        
        ~COsoba();
        
    public:
        TPtrC Imie() const;
        TPtrC Nazwisko() const;
        
        void UstawAdresL( const TDesC& aAdres );
        TPtrC Adres() const;
        
        void UstaWiek( TUint8 aWiek ) { iWiek = aWiek; }
        TUint8 Wiek() const { return iWiek; }
        
    private:
        // Konstruktor pierwszej fazy
        COsoba(){}
        // Konstruktor drugiej fazy
        void ConstructL( const TDesC& aImie, const TDesC& aNazwisko );
        
    private:    // Pola klasy
        // Dynamiczne deskryptory buforowe
        HBufC* iImie;
        HBufC* iNazwisko;
        HBufC* iAdres;
        
        // Na 8 bitach mona zapisa warto od 0 do 255
        // (dugo ycia czowieka zawsze mieci si w tym
        // przedziale).
        TUint8 iWiek;
};


COsoba* COsoba::NewL( const TDesC& aImie, const TDesC& aNazwisko )
{
    COsoba* self = COsoba::NewLC( aImie, aNazwisko );
    CleanupStack::Pop( self );
    return self;
}

COsoba* COsoba::NewLC( const TDesC& aImie, const TDesC& aNazwisko )
{
    COsoba* self = new( ELeave ) COsoba();
    CleanupStack::PushL( self );
    self->ConstructL( aImie, aNazwisko );
    return self;
}

COsoba::~COsoba()
{
    delete iImie;
    delete iNazwisko;
    delete iAdres;
}

void COsoba::ConstructL( const TDesC& aImie, const TDesC& aNazwisko )
{
    // Metoda TDesC::AllocL() tworzy dynamiczny deskryptor buforowy
    // (obiekt klasy HBufC), przekopiowuje do niego zawarto obiektu
    // deskryptora, na ktrym jest woana, oraz zwraca do niego wskanik.
    // Naley pamita, aby zwolni wskanik, gdy nie bdzie on ju
    // potrzebny!
    iImie = aImie.AllocL();
    iNazwisko = aNazwisko.AllocL();
}

TPtrC COsoba::Imie() const
{
    // Pierwszy sposb:
    //return TPtrC( iImie->Ptr(), iImie->Length() );
    
    // Drugi sposb - klasy TPtrC oraz HBufC dziedzicz
    // z TdesC, wic moemy zrobi tak:
    return *iImie;
}

TPtrC COsoba::Nazwisko() const
{
    return *iNazwisko;
}

void COsoba::UstawAdresL( const TDesC& aAdres )
{
    delete iAdres;
iAdres = NULL;
    iAdres = aAdres.AllocL();
}

TPtrC COsoba::Adres() const
{
    return *iAdres;
}
