Як витягнути атрибут


 

При роботі з об’єктами та іншими екземплярами класу звернення до атрибутів є однією зі звичайних операцій для програміста. Отримати доступ до тих чи інших даних, що зберігаються в об’єктах, буває непросто, якщо врахувати використовувані для них способи захисту. Так, атрибути, закриті специфікаторами private і protected, витягнути з екземпляра класу можна лише в методі, який належав об’єкту цього ж або дочірнього (для protected) класу.



Інструкція

  1. Створіть об’єкт або покажчик на екземпляр класу, атрибут якого вам необхідний у програмі. Стандартна конструкція для такої операції: CMyClass myObj1. Іноді для ініціалізації об’єкта в конструктор класу необхідно передати певні параметри. У цьому випадку запис створення об’єкта може виглядати так: CMyClass myObj1 (param1, param2, param3), де CMyClass — ім’я класу, myObj1 — ім’я створюваного об’єкта, а в дужках перераховуються всі запитувані конструктором параметри. Покажчик на екземпляр класу створюється наступним чином: CMyClass * рObj1 = new CMyClass (param1, param2, param3).
  2. Найпростіший випадок виклику атрибута — пряме звернення до нього в будь-якому місці програми. Однак це можливо лише для відкритих даних, описаних в класі з модифікатором public. Прямий доступ через об’єкт виглядає так: myObj1.attr1, де attr1 — атрибут даного класу. Для покажчика виклик буде таким: рObj1-> attr1.
  3. Якщо атрибут, до якого вам необхідно звернутися, має статус прихованого і описаний в класі з модифікатором private, то доступ до нього можливий лише з методу, що належить тому ж класу. Метод або функція класу при цьому повинна мати відкритий статус public. Додайте в клас новий метод, де пропишіть обробку необхідного атрибуту. При цьому в функцію можуть передаватися параметри, в залежності від значення яких виробляються ті чи інші дії. Сама функція також може повертати дані, наприклад вміст атрибута.
    Код програми на мові С + +, який реалізує обидві функції для роботи з закритим атрибутом:

    class CMyClass
    {
    protected:
        int attr1; / / атрибут
    public:
        void funcA1 (int param)
        {
            attr1 = param;
        }
        int funcA2 ()
        {
            return attr1;
        }
    };
      


  4. Таким чином, щоб встановити в закритий атрибут attr1 потрібне вам значення, викличте метод того ж класу за допомогою створеного раніше об’єкту: myObj1.funcA1 (10) — подібної неявній операцією в атрибут attr1 поміщається значення 10. При роботі з покажчиком на екземпляр класу аналогічна операція буде виглядати так: рObj1-> funcA (10). Для того щоб витягти закритий атрибут attr1 і дізнатися що зберігається в ньому значення, викличте інший метод класу: int Res = myObj1.funcA2 (). В даному випадку целочисленной змінної Res присвоїти значення прихованої змінної класу.
  5. При необхідності виклику атрибута зі статусом protected у всіх об’єктах дочірніх класів зверніться до його змінної безпосередньо. Однак при роботі у функціях чужих класів доступ до захищених даними доведеться отримувати вищеописаним способом.
  6. Для виклику атрибута без створення об’єкта оголосіть його змінну в класі, як статичну за допомогою наступної конструкції: static int attr1. В цьому випадку витягнути атрибут можна буде в будь-якому місці програмного коду, вказавши запис: CMyClass :: attr1.