crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> доступ к приватному мемберу класса-владельца из инкапсулированного класса
Алексей1153
  опции профиля:
сообщение 22.11.2012, 12:32
Сообщение #1


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


класс SUBCL преспокойно работает с защищёнными и приватными мемберами OWNER (компилировал в студии)
class OWNER
{
    class SUBCL
    {
        OWNER* m_owner;

    public:
        SUBCL(OWNER* owner):m_owner(owner)
        {
            m_owner->m_private_val  =1;//!!!
            m_owner->m_protected_val=1;//!!!
            m_owner->m_public_val   =1;
        }
    };

private:
    int m_private_val;

protected:
    int m_protected_val;

public:
    int m_public_val;

public:
    OWNER()
        :m_private_val  (0)
        ,m_protected_val(0)
        ,m_public_val   (0)
        ,m_subcl(this)
    {
    }

    SUBCL m_subcl;
};

OWNER o;



а что говорит стандарт по этому поводу ? :) Или инкапсулированный класс автоматически считается friend к хозяину ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.11.2012, 13:04
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Смотри пункт 11.8 стандарта - Nested classes

В C++03 и ранее - нет:
Цитата
The members of a nested class have no special access to members of an enclosing class, nor to classes or
functions that have granted friendship to an enclosing class; the usual access rules (clause 11) shall be
obeyed. The members of an enclosing class have no special access to members of a nested class; the usual
access rules (clause 11) shall be obeyed


В C++11 - да:
Цитата
A nested class is a member and as such has the same access rights as any other member. The members of
an enclosing class have no special access to members of a nested class; the usual access rules (Clause 11)
shall be obeyed.


Пример, приведённый в стандарте С++11 (из последней копии):
class E {
int x;
class B { };
    class I {
        B b; // OK: E::I can access E::B
        int y;
        void f(E* p, int i) {
            p->x = i; // OK: E::I can access E::x
        }
    };
    int g(I* p) {
        return p->y; // error: I::y is private
    }
};


Вот линк на обсуждение:
http://www.open-std.org/jtc1/sc22/wg21/doc...defects.html#45

Сообщение отредактировал Iron Bug - 22.11.2012, 13:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Vass
  опции профиля:
сообщение 22.11.2012, 14:19
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 46
Регистрация: 17.3.2009
Из: Россия, Рыбинск
Пользователь №: 617

Спасибо сказали: 8 раз(а)




Репутация:   0  


Стандарт С++03 говорит вот что:

пункт 11.7 параграф 1: "The members of a nested class have no special access to members of an enclosing class."

Но! Есть документ содержащий поправки к стандарту: http://www.open-std.org/jtc1/sc22/wg21/doc...defects.html#45

И там сказано вот что:
Цитата
change
The members of a nested class have no special access to members of an enclosing class, nor to classes or functions that have granted friendship to an enclosing class; the usual access rules shall be obeyed.
to
A nested class is a member and as such has the same access rights as any other member.


Так что старые компиляторы работают в соответствии с этой поправкой и все ок.

После этого я полез в новый стандарт и там сказано вот что:

Цитата
11.7 Nested classes [class.access.nest]
1 A nested class is a member and as such has the same access rights as any other member. The members of
an enclosing class have no special access to members of a nested class; the usual access rules (Clause 11)
shall be obeyed.

class E {
    int x;

    class B { };

    class I {
        B b; // OK: E::I can access E::B
        int y;

        void f(E* p, int i) {
            p->x = i; // OK: E::I can access E::x
        }
    };

    int g(I* p) {
       return p->y; // error: I::y is private
   }
};


Что значит что тоже все ок.

Но в целом занятно, да :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 17:18