Масиви об’єктів у класах. Приклади. Масиви об’єктів в unmanaged та managed класах. Масив unmanaged (*) покажчиків на об’єкт класу

Масиви об’єктів у класах. Приклади. Масиви об’єктів в unmanaged та managed класах. Масив unmanaged (*) покажчиків на об’єкт класу


Зміст



1. Приклад використання масиву об’єктів в некерованому (unmanaged) класі

Задано клас CMyPoint, що реалізує точку на координатній площині. Задано клас CPolygon, що реалізує ламану лінію. У класі CPolygon оголошується масив з 10 об’єктів типу CMyPoint.
Реалізація класу CMyPoint:

// клас описує точку на координатній площині
class CMyPoint
{
    int x, y;

    public:

    // конструктор класу
    CMyPoint(void) 
    {
        x = y = 0;
    }

    // методи доступу
    int GetX(void) { return x; }
    int GetY(void) { return y; }
    void SetXY(int nx, int ny)
    {
        x = nx;
        y = ny;
    }
};

Реалізація класу CPolygon

// клас, що описує ламану лінію
class CPolygon
{
    int n; // кількість точок
    CMyPoint cp[10]; // масив точок

    public:
    // конструктор класу
    CPolygon(void) { n = 0; }

    // методи доступу
    CMyPoint GetPoint(int index)
    {
        return cp[index];
    }

    // встановлює нове значення заданої точки
    void SetPoint(int index, CMyPoint & pt)
    {
        if (index>=n) return;
        cp[index] = pt;
    }

    // додає точку до ламаної
    void AddPoint(CMyPoint pt)
    {
        if (n<10) n++;
        else return;
        cp[n-1] = pt;
    }

    // визначає довжину ламаної
    double Length(void)
    {
        double len, t;
        int x1, y1, x2, y2;

        len = 0;
        for (int i=0; i<n-1; i++)
        {
            x1 = cp[i].GetX();
            y1 = cp[i].GetY();
            x2 = cp[i+1].GetX();
            y2 = cp[i+1].GetY();
            t = System::Math::Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
            len += t;
        }
        return len;
    }
};

Демонстрація використання класів CPolygon та CMyPoint в деякому методі

// демонстрація використання класу CPolygon
CPolygon p1;
CMyPoint pt1;

// сформувати ламану з координатами (1; 2), (3; 4), (5;6)
pt1.SetXY(1, 2);
p1.AddPoint(pt1);

pt1.SetXY(3, 4);
p1.AddPoint(pt1);

pt1.SetXY(5, 6);
p1.AddPoint(pt1);

// перевірка
int x, y;
CMyPoint pt2;

pt2 = p1.GetPoint(0);
x = pt2.GetX(); // x = 1
y = pt2.GetY(); // y = 2

pt2 = p1.GetPoint(1);
x = pt2.GetX(); // x = 3
y = pt2.GetY(); // y = 4

// довжина ламаної
double d = p1.Length(); // d = 5.6568...

2. Приклад використання масиву об’єктів в керованому (managed) класі

Реалізація класу CMyPoint

// клас, що описує точку на координатній площині
ref class CMyPoint
{
    int x, y;

    public:
    // конструктор класу
    CMyPoint(void)
    {
        x = y = 0;
    }

    // методи доступу
    int GetX() { return x; }
    int GetY() { return y; }

    void SetXY(int nx, int ny)
    {
        x = nx;
        y = ny;
    }
};

Реалізація класу CPolygon

// клас, що описує багатокутник
ref class CPolygon
{
    int n; // кількість точок в багатокутнику
    array <CMyPoint^> ^mp; // масив точок CMyPoint

    public:
    // конструктор без параметрів
    CPolygon(void);

    // конструктор з 2 параметрами, що отримує масив точок CMyPoint
    CPolygon::CPolygon(int n, array <CMyPoint^> ^mp2);

    // методи доступу 
    CMyPoint^ GetPoint(int index); // повертає точку
    void AddPoint(int nx, int ny); // додає точку до ламаної
    double Length(void); // визначає довжину ламаної
};

// конструктор класу
CPolygon::CPolygon(void)
{ 
    n = 0;

    // виділити пам'ять - тільки 1 раз
    // для масиву в цілому
    mp = gcnew array <CMyPoint^>(10);

    // для кожного елементу масиву
    for (int i=0; i<10; i++)
        mp[i] = gcnew CMyPoint;
}

// конструктор з 2 параметрами - ініціалізується масивом значень
CPolygon::CPolygon(int n, array <CMyPoint^> ^mp2)
{
    if (n>10) return;
    this->n = n;

    // присвоїти масив mp = mp2
    for (int i=0; i<n; i++)
    {
        mp[i] = mp2[i];
    }
}

// методи доступу
// зчитати точку з заданим індексом
CMyPoint^ CPolygon::GetPoint(int index)
{
    return mp[index];
}

// додати точку до ламаної
void CPolygon::AddPoint(int nx, int ny)
{
    n++;
    mp[n-1]->SetXY(nx, ny);
}

// визначити довжину ламаної
double CPolygon::Length(void)
{
    int x1, y1, x2, y2;
    double len, t;
    CMyPoint^ pt;

    len = 0; // довжина ламаної

    for (int i=0; i<n-1; i++)
    {
        x1 = mp[i]->GetX();
        y1 = mp[i]->GetY();
        x2 = mp[i+1]->GetX();
        y2 = mp[i+1]->GetY();
        t = System::Math::Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
        len += t;
    }
    return len; 
}

Демонстрація використання класів в іншому програмному коді

// демонстрація використання класу CPolygon
CPolygon^ cp;
cp = gcnew CPolygon;

// сформувати ламану з координатами (1;2), (3;4), (5;6)
cp->AddPoint(1, 2);
cp->AddPoint(3, 4);
cp->AddPoint(5, 6);

// перевірка
int x, y;
CMyPoint^ pt = gcnew CMyPoint;

pt = cp->GetPoint(0);
x = pt->GetX(); // x = 1
y = pt->GetY(); // y = 2

pt = cp->GetPoint(1);
x = pt->GetX(); // x = 3
y = pt->GetY(); // y = 4

// визначити довжину ламаної
double d;
d = cp->Length(); // d = 5.6568...

3. Приклад використання масиву unmanaged-покажчиків на об’єкт класу

Реалізація класу CMyPoint

class CMyPoint
{
    int x, y;

    public:
    // конструктор 
    CMyPoint::CMyPoint(void)
    {
        x = y = 0;
    }

    // методи доступу
    int GetX(void) { return x; }
    int GetY(void) { return y; }

    void SetXY(int x, int y)
    {
        this->x = x;
        this->y = y;
    } 
};

Реалізація класу CPolygon

// клас, що описує ламану лінію
class CPolygon
{
    int n;
    CMyPoint * mp[10]; // масив покажчиків на CMyPoint

    public:
    // конструктор
    CPolygon(void)
    {
        n = 0;

        // виділення пам'яті - лише один раз 
        for (int i=0; i<10; i++)
        {
            mp[i] = new CMyPoint;
        }
    }

    // методи доступу
    CMyPoint GetPoint(int index)
    {
        return *mp[index];
    }

    void SetPoint(int index, CMyPoint& p)
    {
        int x, y;
        x = p.GetX();
        y = p.GetY(); 
        mp[index]->SetXY(x, y);
    }

    // додати нову точку
    void AddPoint(int x, int y)
    {
        mp[n++]->SetXY(x, y);
    }

    // обчислення довжини ламаної
    double Length(void)
    {
        double len, t;
        int x1, y1, x2, y2;

        len = 0;
        for (int i=0; i<n-1; i++)
        {
            x1 = mp[i]->GetX();
            y1 = mp[i]->GetY();
            x2 = mp[i+1]->GetX();
            y2 = mp[i+1]->GetY();
            t = System::Math::Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
            len = len + t;
        }
        return len;
    }
};

Фрагмент методу, що демонструє використання класу CPolygon

// демонстрація використання масиву unmanaged-покажчиків на об'єкт класу
CPolygon cp; // об'єкт класу

// сформувати ламану з трьох точок
cp.AddPoint(1, 2);
cp.AddPoint(3, 4);
cp.AddPoint(5, 6);

// перевірка
int x, y;
CMyPoint mp;
mp = cp.GetPoint(0);
x = mp.GetX(); // x = 1
y = mp.GetY(); // y = 2

// визначення довжини ламаної
double d;

d = cp.Length(); // d = 5.6568...


Зв’язані теми