Страниц: [1] 2
  Печать  
Автор Тема: Видимость изнутри вложенного класса...  (Прочитано 15713 раз)
Wlad
Участник
*
Offline Offline

Сообщений: 3


Просмотр профиля
« : Апреля 17, 2005, 03:39:15 pm »

Добрый день всем!

вот такой незамысловатый пример:

class A
{
public:
  int i;
 
  class B
  {
   void B_func(void) {  i=5; };
  };
};

вызывает ругань g++, что он не видит i...
то же самое и на счёт методов из А...

Я в раздумьях...
Записан
Dipsy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #1 : Апреля 18, 2005, 04:54:11 am »

Ну во первых так делать нельзя. Можно написать
A A1;
A1.i=5;
или A::i, если i - static
А что было бы если бы и в 'B' был член с именем i, как их отличать? this->i и просто i это в контексте 'B' одно и то же. A::i применимо только для статических членов...
Записан
Wlad
Участник
*
Offline Offline

Сообщений: 3


Просмотр профиля
« Ответ #2 : Апреля 18, 2005, 06:48:16 pm »

Dipsy
<i>Ну во первых так делать нельзя. Можно написать
A A1;
A1.i=5;
или A::i, если i - static
А что было бы если бы и в 'B' был член с именем i, как их отличать? this->i и просто i это в контексте 'B' одно и то же. A::i применимо только для статических членов...
</i>

Видимо, у кого-то из нас трудности... Или с изложением, или с восприятием... В огороде бузина, а в Киеве - демократия с нечеловеческим лицом... :о)

Вопрос был о том, как добраться (с минимальной мозготряской), до членов ВНЕШНЕГО КЛАССА(не важно данные или функции) ИЗ ФУНКЦИЙ ВЛОЖЕННОГО КЛАССА ...
Для вашей осведомлённости - разделы 9.7 + 11.3 стандарта (за 98 год). Оказывается, это ещё один "подарочек" от любимого языка. Почему так сделано - не понимаю... Самое интересное, что вместо того, что бы естественным образом разработать области видимости по вложенностям, ввели области имён... То же полезно, но не симметрично отностительно классов... Впрочем, как всегда... Ей богу, иногда кажется, что или труп страуса, или весь комитет всовокупности по стандарту Си++, после хорошего прихода за работу садятся...
Записан
Dipsy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #3 : Апреля 19, 2005, 04:46:01 am »

Wlad кто то из нас путает понятия класс и объект класса. То что класс B вложен в А ещё не означает доступа к переменным A. Классы получаются независимые в любом случае. Для того что вы хотите наследование нужно. А для доступа к объекту ОДНОГО класса из Другого нужен ОБЪЕКТ другого класса (указатель, ссылка на объект). Или член должен быть статическим. Вы, наверное на паскале много программировали, вложенные процедуры всякие и т.п...
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #4 : Апреля 19, 2005, 05:38:27 am »

Wlad
<i>Вопрос был о том, как добраться (с минимальной мозготряской), до членов ВНЕШНЕГО КЛАССА(не важно данные или функции) ИЗ ФУНКЦИЙ ВЛОЖЕННОГО КЛАССА ...
</i>

9.7  Nested class declarations
<i>
The nested class  is  in  the  scope  of  its enclosing  class. Except by using explicit pointers, references, and object names, declarations in a nested class can use only type names, static members, and enumerators from the enclosing class.
</i>

Отсюда следует, что i в вашем примере должна быть
static int i;
Или используйте указатели

class A
{
public:
int i;

class B
{
void B_func(A *p) { p->i=5; };
};
};
 

Я в C++ не силен. Не могли бы вы сказать - а зачем вложенные классы нужны? Я понимаю наследование... Но практического смысла вложенного класса не вижу, повторяюсь, может потому что я С++ не пользую чтобы часто и без надобности.
Записан
Dipsy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #5 : Апреля 19, 2005, 06:36:15 am »

ed1k
Не могли бы вы сказать - а зачем вложенные классы нужны? Я понимаю наследование... Но практического смысла вложенного класса не вижу
Область видимости! Если класс В используется только в классе А, то нет смысла вытаскивать его в глобальную область видимости... Затем же что и неймспейсы.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #6 : Апреля 19, 2005, 07:37:34 am »

Dipsy
Если класс В используется только в классе А, то нет смысла вытаскивать его в глобальную область видимости...

То также нет особого смысла делать из него отдельный класс. А вот namespace в этом плане гораздо удобнее.

Wlad
Самое интересное, что вместо того, что бы естественным образом разработать области видимости по вложенностям, ввели области имён...

Церебральный инцест - не естественная среда человека. Может лучше тогда вам и не трогать C++ Huh? И глядишь демократия лучше смотреться будет...

Wlad
Ей богу, иногда кажется, что или труп страуса, или весь комитет всовокупности по стандарту Си++, после хорошего прихода за работу садятся...

Когда кажется - креститься нужно.
Записан

Wlad
Участник
*
Offline Offline

Сообщений: 3


Просмотр профиля
« Ответ #7 : Апреля 19, 2005, 07:40:05 am »

Dipsy
Wlad кто то из нас путает понятия класс и объект класса.

Могу на 101% Вас заверить, что в данном случае - не по адресу... :о)

Dipsy
То что класс B вложен в А ещё не означает доступа к переменным A.

К переменными класса А - может быть. Всё по той же причине принципов областей видимости. Ведь В находится структурно внутри А. Его объемлет область видимости А. Так почему же?... :о)

Dipsy
Классы получаются независимые в любом случае.

Тогда вопрос - зачем нам такая вложенность? Зачем разрешать некое средство, не полностью, покрывающее все варианты и потенциал своего использования???

Dipsy
Для того что вы хотите наследование нужно.

Ну, наследование - не в каждой дырке затычка (панацея)... Да и само наследование - довольно каличный механизм для развития функциональности... Но это уже совсем другая история и не для этого форума... :о)

Dipsy
А для доступа к объекту ОДНОГО класса из Другого нужен ОБЪЕКТ другого класса (указатель, ссылка на объект).

В случае статических функций это не так...
Кроме того, в нормальной логике, синтаксис, позволяющий описать нечто вложенное подразумевает описание СТРУКТУРЫ. Нечто, что состоит из частей, пусть даже речь идёт о ТИПАХ. В данном случае мы объявляем тип В ЧАСТЬЮ описания типа А.

Цитата: Dipsy
Вы, наверное на паскале много программировали, вложенные процедуры всякие и т.п.../quote]
Если в Вашем понятии это насмешка или оскорбление, то я воспринимаю не иначе, как похвалу.
... и не только на Паскале, а ещё и на Смолтоке, Форте, Лиспе, Яве, ПЛ/1, Фортране, Оберонах, Бэйсике и куче ассемблеров. Поэтому не ограничиваюсь возможным "единственно правильным" обустройством "мира" в рамках только одного языка и парадигмы... Чего и Вам желаю. Потому, что знание идей и концепций обогощает и помогает находить решения даже в рамках одного языка, а замыкаться в рамках одного мировосприятия, да ещё добровольно - ведёт к однобокости и ограниченности ума, самолюбованию и эстетству... А от последнего один шаг до сами знаете чего... Ну типа, как у Александреску... :о)
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #8 : Апреля 19, 2005, 07:47:17 am »

Wlad
... что является просто маразмом, согласитесь. Всё по той же причине принципов областей видимости.

Wlad, вы говорите чушь. Полнейшую.
Wlad
Тогда вопрос - зачем нам такая вложенность? Зачем разрешать некое средство, не полностью, покрывающее все варианты и потенциал своего использования???

Який, в дупу, потенциал ? RTFM, RTFM, STFW

Wlad
... и не только на Паскале, а ещё и на Смолтоке, Форте, Лиспе, Яве, ПЛ/1, Фортране, Оберонах, Бэйсике и куче ассемблеров, поэтому не ограничиваюсь возможным "единственно правильным" обустройством "мира" в рамках только одного языка и парадигмы...

Памятник куда заносить ?
Записан

Shrek
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #9 : Апреля 19, 2005, 09:18:16 am »

Вложенные классы используются редко, в силу того что в С++ существует гибкий и мощный механизм наследования, необходимости создавать вложенные классы практически нет.

Вложенные классы в С++ это все равно что вложенные функции в С++ и С (Работать то работает но гемороя при разбирании кода необобраться).

Вы напишите что вы хотите, может эту задачку можно и другим способом решить.

З.Ы. Вы знаете суп или борщ можно есть еще взяв ложку в руку развернув ее предварительно на 180 градуссов. Этого никто не запрещал и никто не говорит, что неполучиться.
Странно вот только почему так никто не ест, ну разве что ребенок попробовав один раз в детстве, больше к этому не возвращается.

Зри в корень. Кузма Прутков.
Записан
Dipsy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #10 : Апреля 19, 2005, 09:33:58 am »

Wlad, если вы хотите пофилософствовать насчет того, почему в С++ сделано так а не иначе, то это одно дело - а когда вы ругаете компилятор за то, что он не позволяет реализовать такую замечательную идею, не принимая во внимание то, что это не предусмотрено самой идеологией языка, подразумевает соответствующее к вам отношение
Записан
Wlad
Участник
*
Offline Offline

Сообщений: 3


Просмотр профиля
« Ответ #11 : Апреля 19, 2005, 09:44:20 am »

Shrek
Вы напишите что вы хотите, может эту задачку можно и другим способом решить.

"...Признаю свою вину, меру, степень, глубину..."
На "родственном" (qnxclub.net) сайте шла речь о написании библиотеки для эмуляции активных объектов в духе Активного Оберона и Зоннона на Си++.
Библиотека написана для случая, когда объект имеет одну активность на экземпляр. Если бы Си++ имел нормальный механизм видимости для вложенных классов, то написание для случая "N типов активностей" в объекте представляло бы из себя дополнительные 3 строчки в ao.h. А так придётся геморройничать в обычном духе Си++.

Почему нужен вложенный класс?
Если идти от определения диалога с объектом, то для поддержания дисциплины слежения за правильностью протокола обмена по определённому протоколу, нужно определять тип активности диалога. Определить-то мы её определим, но "конкретность" действий методов конрктного типа активности, описывающей диалог, как раз и раскрывается во встроенных типах, как это пытался сделать я.Наследование здесь не проходит.Потому, что реализация активности типа диалога в конкретном классе, определяет "самостный" тип относительно как раз содержащего его класса.

Если для кого-то это звучит полнейшей чепухой - его проблемы. Для тех, кто остался на уровне технологий середины 70-х - начала-середины 80-х, конечно всё щастье ограничивается "а зачем нам вложенные классы?" и изысканиями на грани мозгового онанизма Александреску. Но жисть-то она на месте не стоит... :о)
Записан
MikeP
Участник
*
Offline Offline

Сообщений: 6


Просмотр профиля WWW
« Ответ #12 : Апреля 19, 2005, 10:09:03 am »

Wlad
Проблемы стилистики и витиеватости языка предлагаю решать на qnxclub.net.
Здесь словоблудием заниматься не стоит и не превращайте, пожалуйста, этот форум в помойку, где складируются несбывшиеся мечты и неоправдавшиеся чаяния.

Форум практический, а не теоретический. Вам уже объяснили, почему так нельзя. Если вам нужно решить задачу - послушайте высказавшихся - сделайте по-другому.
Если вас просто тянет подискутировать на тему возможностей языка - делайте это в другом месте.
Записан
Wlad
Участник
*
Offline Offline

Сообщений: 3


Просмотр профиля
« Ответ #13 : Апреля 19, 2005, 06:33:26 pm »

Сделать я уже и так сделал. Скоро выложу на qnxclub.net очередную версию библиотеки. Если кому интересно - потестируйте.
Сейчас на новой работе те же подходы и немного изменённые макросы использую с Си.

Тему, в принципе, можно стереть, если у кого свербит сильно на предмет "чистоты рядов"... Тем более, что это унас сейчас актуалиссимо... :о)
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #14 : Апреля 20, 2005, 07:35:23 am »

Wlad
Тему, в принципе, можно стереть

Тему в принципе можно было не создавать.
Записан

Страниц: [1] 2
  Печать  
 
Перейти в: