Об’єкти класу як члени даних класу. Приклади

Об’єкти класу як члени даних класу. Приклади


Зміст


1. Приклад оголошення та використання об’єкту класу, який є членом-даних іншого класу

Як відомо, у класах можуть оголошуватись члени даних класу, які є об’єктами інших класів. У даному прикладі продемонстровано використання двох об’єктів, що є членами даних класу.

У прикладі оголошується 2 класи:

  • клас CMyPoint, що визначає точку з координатами x, y;
  • клас CMyLine, що визначає лінію, яка містить два об’єкти типу CMyPoint. Ці об’єкти містять координати кінців відрізка, з яких будується лінія.

Клас CMyPoint містить:

  • внутрішні члени даних x, y;
  • конструктор за замовчуванням CMyPoint();
  • методи читання внутрішніх даних класу GetX(), GetY();
  • метод SetXY(), що встановлює нові значення x, y.

Клас CMyLine містить:

  • внутрішні члени-даних класу типу CMyPoint з іменами mp1, mp2. Ці члени-даних є об’єктами класу CMyPoint. Вони визначають 2 точки, з яких складається лінія;
  • конструктор за замовчуванням CMyLine();
  • методи читання значення об’єктів mp1, mp2 які мають відповідно імена GetPoint1(), GetPoint2();
  • метод SetLine() для встановлення нового значення координат кінців відрізку CMyLine;
  • метод Length(), що обчислює довжину відрізка.


Оголошення та реалізація методів класів CMyPoint та CMyLine

// оголошення класу CMyPoint
class CMyPoint
{
    int x;
    int y;

    public:
    CMyPoint(void); // конструктор за замовчуванням

    // методи класу
    int GetX(void)
    {
        return x;
    }

    int GetY(void)
    {
        return y;
    }

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

// конструктор за замовчуванням
CMyPoint::CMyPoint(void)
{
    x = y = 0;
}

// ----------------------------------------------
// оголошення та реалізація методів класу CMyLine
class CMyLine
{
    CMyPoint mp1;
    CMyPoint mp2;

    public:
    // конструктор за замовчуванням
    CMyLine(void);

    // методи доступу
    CMyPoint GetPoint1(void)
    {
        return mp1;
    }

    CMyPoint GetPoint2(void)
    {
        return mp2;
    }

    void SetLine(CMyPoint p1, CMyPoint p2);

    // метод, що повертає довжину лінії
    double Length(void);
};

// реалізація методів класу CMyLine
CMyLine::CMyLine(void)
{
    mp1.SetXY(0,0);
    mp2.SetXY(1,1);
}

// встановити нові значення точок 
void CMyLine::SetLine(CMyPoint p1, CMyPoint p2)
{
    int tx, ty;
    tx = p1.GetX();
    ty = p1.GetY();
    mp1.SetXY(tx, ty);
    tx = p2.GetX();
    ty = p2.GetY();
    mp2.SetXY(tx, ty);
}

// метод, що повертає довжину лінії
double CMyLine::Length(void)
{
    int x1, y1, x2, y2;
    double len;

    x1 = mp1.GetX();
    y1 = mp1.GetY();
    x2 = mp2.GetX();
    y2 = mp2.GetY();

    len = System::Math::Sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
    return len; 
}

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

CMyPoint mp1, mp2;
CMyLine ml;
int d;

// виклик методів класу CPoint
// заповнення значень об'єктів mp1, mp2
mp1.SetXY(5, 8);
d = mp1.GetX(); // d = 5
mp2.SetXY(9, 11);

// виклик методів з класу CMyLine
ml.SetLine(mp1, mp2); // встановити нові значення точок

// виклик методу, що повертає першу точку з лінії
mp1 = ml.GetPoint2();

// перевірка
d = mp1.GetX(); // d = 9
d = mp1.GetY(); // d = 11

// обчислення відстані відрізка ml
// виклик методу Length
double length;
length = ml.Length(); // length = 5.0

2. Яким чином виконується виклик конструкторів, якщо в класі A використовується об’єкт класу B? Яким чином виділяється пам’ять для об’єктів цих класів?

Якщо в класі A оголошується об’єкт класу B, то при оголошенні об’єкту класу A конструктори обох класів викликаються у такій послідовності:

  • конструктор класу B;
  • конструктор класу A.

Таку послідовність дій компілятор формує автоматично.
Пам’ять для членів-даних класу, які є об’єктами класу, виділяється при виділенні пам’яті для класу, в якому ці об’єкти реалізовані. Тобто, якщо описати об’єкт класу A, в якому є об’єкт класу B, то пам’ять для об’єкту класу A виділяється з врахуванням (включає в себе) пам’яті об’єкту класу B.
Наприклад. Якщо взяти клас CMyPoint, що оголошений у п. 1 цієї теми, то при створенні обо’єкту класу CMyLine, спочатку викликається відповідний конструктор класу CMyPoint (виділяється пам’ять), а потім викликається конструктор класу CMyLine.


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