powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / classic C++. why no access?
9 сообщений из 9, страница 1 из 1
classic C++. why no access?
    #33228230
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class A
{
protected:
	int m_a;
};


class B : public A
{
	B(const A &a);
};


B::B(const A& a)
{
	a.m_a;        // cannot access? :(
}
...
Рейтинг: 0 / 0
classic C++. why no access?
    #33228247
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJ...protected: int m_a;....

и Вы попытались обратиться не к СВОЕМУ экземпляру обьекта "A", а к "чужому", пришедшего по ссылке.


с уважением
(круглый)
ЗЫ
А вот такая комбинация "прокатит" из обьекта "B" к "A". но к своему :)

A::m_a;
...
Рейтинг: 0 / 0
classic C++. why no access?
    #33228251
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a - другой объект
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
classic C++. why no access?
    #33229947
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего гоните-то ? В C++ доступ к членам класса контролируется на уровне классов, а не объектов. Это вам не smalltalk. Так что B будет иметь доступ к protected-члену своего предка - класса A.

На счет A::m_a; - m_a не static member, к нему нельзя иметь доступ через имя класса. Поэтому здесь это будет воспринято как область определения, но поскольку m_a в B нет, то область определения можно просто опустить.
Т.е. писать m_a. Но все равно и m_a и a.m_a допустимы.
...
Рейтинг: 0 / 0
classic C++. why no access?
    #33229962
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты компилировать пробовал ?
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
classic C++. why no access?
    #33229982
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class A
{
protected:
 int m_a;
};


class B : public A
{
 B(const A &a);
};


B::B(const A& a)
{
 m_a;        // cannot access? :(
}
компилируется

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class A
{
protected:
 int m_a;
};


class B : public A
{
 B(const A &a);
};


B::B(const A& a)
{
 a.m_a;        // cannot access? :(
}
не компилируется, ошибка:
Код: plaintext
[C++ Error] Unit2.cpp( 26 ): E2247 'A::m_a' is not accessible

PS: компилятор Borland C++ 5.5.1
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
classic C++. why no access?
    #33230091
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv....Так что B будет иметь доступ к protected-члену своего предка - класса A.

На счет A::m_a; - m_a не static member, к нему нельзя иметь доступ через имя класса. Поэтому здесь это будет воспринято как область определения, но поскольку m_a в B нет, то область определения можно просто опустить.
Т.е. писать m_a. Но все равно и m_a и a.m_a допустимы.

Ключевые слова public, protected и private как раз и РАЗГРАНИЧИВАЮТ ДОСТУП к членам класса. Вы произнесли правильно фразу... "СВОЕГО" предка. Свой предок - тот от которого порождён. А имя которое Вы ему присвоили (хоть Васю Пупкина) синтаксис языка не регламентирует (только в разделе уникальности). Посему "A" ПАРЕНТ не есть "A" из передаваемых ПАРАМЕТРОВ.
По поводу комбинации ...

A::m_a - данное использование понятно - откель взялось m_a.
Если Вам это поперёк одного места - мона и просто m_a.
По мне - вообще не совсем корректно лезть поперёк "родного" класса, который содержит енту переменную. Но строгость иногда полезно и похерить, но аккуратно :)


с уважением
(круглый)
ЗЫ
И как говорил один профессор математики, выводя по памяти доказательства всевозможных теорем.
- "Кто не верит - пусть проверит !"
(от себя добавлю, - "Пусть компильнёт!")
...
Рейтинг: 0 / 0
classic C++. why no access?
    #33230473
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to kolobok0, Карабас Барабас
И я прекрасно вижу, что
a - другой объект


MasterZivВ C++ доступ к членам класса контролируется на уровне классов, а не объектов. Это вам не smalltalk. Так что B будет иметь доступ к protected-члену своего предка - класса A.


Вот-вот. Мне тоже всегда так казалось. А ведь не компилируется-то приведенный мной первый пример.. :((

Все же не понятно ://
...
Рейтинг: 0 / 0
classic C++. why no access?
    #33230564
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так нельзя.
В данном случае доступ к защищенным членам можно осуществлять через this, через указатель или ссылку на сам производный класс, но не через базовый.

п. 11.5 стандарта. (там же есть наглядный пример корректного кода и ill-formed).

p.s. Хотя логика такого поведения мне самому не совсем понятна :)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / classic C++. why no access?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]