
//
// To jest przykładowy kod z podrozdziału 17.7 „Wskaźniki na obiekty klas” książki
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include <vector>

//------------------------------------------------------------------------------

// Bardzo uproszczony wektor liczb typu double.
class vector {
    int sz;            // rozmiar
    double* elem;      // wskaźnik na elementy
public:
    vector(int s) :sz(s), elem(new double[s]) { } // konstruktor
    ~vector() { delete[] elem; }                  // destruktor

    int size() const { return sz; }               // bieżący rozmiar wektora

    double get(int n) { return elem[n]; }         // dostęp: odczyt
    void set(int n, double v) { elem[n]=v; }      // dostęp: zapis
};

//------------------------------------------------------------------------------

vector* f(int s)
{
    vector v(s);
    vector* p = new vector(s); // Alokacja wektora w obszarze pamięci wolnej.
    // ...
    *p = v;                    // Kopiowanie danych do wektora poprzez wskaźnik.
    return p;
}

//------------------------------------------------------------------------------

void ff()
{
    vector* q = f(4);
    vector vv = *q;            // Kopiowanie danych z wektora poprzez wskaźnik.
    // ...
    delete q;                  // Usunięcie wektora z pamięci wolnej.
}

//------------------------------------------------------------------------------

int main()
{
    int     s = 100;
    vector* p = new vector(s); // Alokacja wektora w obszarze pamięci wolnej.
    delete p;                  // dealokacja

    // Przykład z użyciem standardowego wektora z biblioteki STL.
    {
        using std::vector;

        vector< vector<double> >* p
            = new vector<vector<double> > (10);
        delete p;

        vector< vector< vector<double> > >* q
            = new vector<vector<vector<double> > > (20);
        delete q;
    }

    // Wszystkie klasy obsługują operator . (kropka) umożliwiający uzyskanie dostępu do składowych.
    {
        vector v(4);
        int x = v.size();
        double d = v.get(3);
    }

    // Wszystkie klasy obsługują operator -> (strzałka) umożliwiający uzyskanie dostępu do składowych.
    {
        vector* p = new vector(4);
        int x = p->size();
        double d = p->get(3);
    }
}

//------------------------------------------------------------------------------
