Массивы объектов в классах. Примеры. Массивы объектов в 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...


Связанные темы