QNX.ORG.RU

Разработка => Языки и алгоритмы => Тема начата: Wlad от Апреля 17, 2005, 03:39:15 pm



Название: Видимость изнутри вложенного класса...
Отправлено: Wlad от Апреля 17, 2005, 03:39:15 pm
Добрый день всем!

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

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

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

Я в раздумьях...


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


Название: Видимость изнутри вложенного класса...
Отправлено: Wlad от Апреля 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 от Апреля 19, 2005, 04:46:01 am
Wlad кто то из нас путает понятия класс и объект класса. То что класс B вложен в А ещё не означает доступа к переменным A. Классы получаются независимые в любом случае. Для того что вы хотите наследование нужно. А для доступа к объекту ОДНОГО класса из Другого нужен ОБЪЕКТ другого класса (указатель, ссылка на объект). Или член должен быть статическим. Вы, наверное на паскале много программировали, вложенные процедуры всякие и т.п...


Название: Видимость изнутри вложенного класса...
Отправлено: ed1k от Апреля 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 от Апреля 19, 2005, 06:36:15 am
ed1k
Не могли бы вы сказать - а зачем вложенные классы нужны? Я понимаю наследование... Но практического смысла вложенного класса не вижу
Область видимости! Если класс В используется только в классе А, то нет смысла вытаскивать его в глобальную область видимости... Затем же что и неймспейсы.


Название: Видимость изнутри вложенного класса...
Отправлено: lestat от Апреля 19, 2005, 07:37:34 am
Dipsy
Если класс В используется только в классе А, то нет смысла вытаскивать его в глобальную область видимости...

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

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

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

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

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


Название: Видимость изнутри вложенного класса...
Отправлено: Wlad от Апреля 19, 2005, 07:40:05 am
Dipsy
Wlad кто то из нас путает понятия класс и объект класса.

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

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

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

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

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

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

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

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

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

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


Название: Видимость изнутри вложенного класса...
Отправлено: lestat от Апреля 19, 2005, 07:47:17 am
Wlad
... что является просто маразмом, согласитесь. Всё по той же причине принципов областей видимости.

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

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

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

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


Название: Видимость изнутри вложенного класса...
Отправлено: Shrek от Апреля 19, 2005, 09:18:16 am
Вложенные классы используются редко, в силу того что в С++ существует гибкий и мощный механизм наследования, необходимости создавать вложенные классы практически нет.

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

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

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

Зри в корень. Кузма Прутков.


Название: Видимость изнутри вложенного класса...
Отправлено: Dipsy от Апреля 19, 2005, 09:33:58 am
Wlad, если вы хотите пофилософствовать насчет того, почему в С++ сделано так а не иначе, то это одно дело - а когда вы ругаете компилятор за то, что он не позволяет реализовать такую замечательную идею, не принимая во внимание то, что это не предусмотрено самой идеологией языка, подразумевает соответствующее к вам отношение


Название: Видимость изнутри вложенного класса...
Отправлено: Wlad от Апреля 19, 2005, 09:44:20 am
Shrek
Вы напишите что вы хотите, может эту задачку можно и другим способом решить.

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

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

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


Название: Видимость изнутри вложенного класса...
Отправлено: MikeP от Апреля 19, 2005, 10:09:03 am
Wlad
Проблемы стилистики и витиеватости языка предлагаю решать на qnxclub.net.
Здесь словоблудием заниматься не стоит и не превращайте, пожалуйста, этот форум в помойку, где складируются несбывшиеся мечты и неоправдавшиеся чаяния.

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


Название: Видимость изнутри вложенного класса...
Отправлено: Wlad от Апреля 19, 2005, 06:33:26 pm
Сделать я уже и так сделал. Скоро выложу на qnxclub.net очередную версию библиотеки. Если кому интересно - потестируйте.
Сейчас на новой работе те же подходы и немного изменённые макросы использую с Си.

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


Название: Видимость изнутри вложенного класса...
Отправлено: lestat от Апреля 20, 2005, 07:35:23 am
Wlad
Тему, в принципе, можно стереть

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


Название: Видимость изнутри вложенного класса...
Отправлено: Wlad от Апреля 20, 2005, 01:01:14 pm
lestat
Тему в принципе можно было не создавать.

Ну, если именно Вы так считаете, то, тогда - конечно... :о)

Но, с другой стороны, выяснились интересныя подробности...
Приходит человек. Не новичок. Есть проблема. Всеобщее стандартное средство оказывается с довольно своеобразным пониманием очевидных вещей. Но, высказанные замечания, под улюлюканье и крики "не замай риднесеньке!", без малейших потуг на разбирательство и желание понять, почему именно об этом человек спрашивает и почему именно так предлагает сделать, сводятся к отсылу на стандарт. Да мне по фиг стандарт в данном случае! Более того, оказывается, что он не универсален и не адекватен возникающим потребностям...
Сталкивались с подобными проблемами - расскажите. Нет - послушайте, что другие скажут. А то, что "в уставе вот так написано" я и без вас знаю. Я спрашивал о мерах обхода этих ограничений. Мне не задачу надо подгонять под средства реализации, а средство использовать вне ограничений и врождённых рамок. Я не хочу предметную область обрезать и коверкать из-за средства реализации. Я хочу имеющимся средством (уж какое, бог послал), реализовать некоторые концепции, не заложенные изначально в языке. Потому, что считаю, что имение их в арсенале программера может оному пользу принести. Потому, что имея это средство, вы сможете предметные области с большим числом параллельно работающих активных сущностей описывать более естественным языком.

А вы мне предлагаете искать там, где светло... :о)


Название: Видимость изнутри вложенного класса...
Отправлено: lestat от Апреля 20, 2005, 01:23:28 pm
Wlad
Я спрашивал о мерах обхода этих ограничений

тут и на qnxclub дали 4 разные способа обхода, к чему дальнейшее словоблудие про обкуренных стандартистов, про трупы страуса и прочие демократии. Язык чешется ? Ну так об забор почешите ...


Название: Видимость изнутри вложенного класса...
Отправлено: MikeP от Апреля 20, 2005, 04:32:54 pm
Wlad
Вы пытаетесь решить нетривиальную задачу в рамках стандарта. Ну так и пишите тем, кто стандарты разрабатывает - может они вас выслушают и сделают соответствующие поправки в тот самый стандарт, который вам так крылья обрезает...

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


Название: Видимость изнутри вложенного класса...
Отправлено: Wlad от Апреля 20, 2005, 08:21:04 pm
MikeP
Ну так и пишите тем, кто стандарты разрабатывает - может они вас выслушают и сделают соответствующие поправки в тот самый стандарт, который вам так крылья обрезает

УжЕ. Знаете, что один такой работничек ответил? "Не Вы мне деньги платите и не Ваши поправки, пусть и самые никчемные, в Вашем компиляторе будут использованы миллионом программистов... А про удобно-неудобно пишите в БАЙТ..."

То есть можно до хрипоты что-то доказывать очевидность каличности, но если даденек не задобришь (как и везде) - хрен чего добъёшься...


Название: Видимость изнутри вложенного класса...
Отправлено: olej от Апреля 21, 2005, 12:37:23 am

УжЕ. Знаете, что один такой работничек ответил? "Не Вы мне деньги платите и не Ваши поправки, пусть и самые никчемные, в Вашем компиляторе будут использованы миллионом программистов... А про удобно-неудобно пишите в БАЙТ..."

То есть можно до хрипоты что-то доказывать очевидность каличности, но если даденек не задобришь (как и везде) - хрен чего добъёшься...


А ещё можно "говорить", а можно "говорить" .
Есть ещё интонации и тон: если прийти к человеку, который который уже год лабает тот компилятор, и начать менторским тоном расказывать что и где у него отстой (а точнее, что везде - отстой)...

"А вы подойдите к вон тому каменщику и объясните ему, что он не так кладёт кладку..."(с) не помню, по-моему Задорнов .


Название: Видимость изнутри вложенного класса...
Отправлено: Shrek от Апреля 21, 2005, 09:32:16 am
Ну это как в поговорке

Знаете что плохому танцору мешает?

А лечится очень легко, либо бросить танцевать (и нечего мешать не будет), либо удалить то что мешает (и тоже ничего мешать не будет).

Как видим в обеих случаях результат одинаков. А следовательно от компилятора ничего не зависит.


Название: Видимость изнутри вложенного класса...
Отправлено: Wlad от Апреля 21, 2005, 04:03:18 pm
Shrek
Знаете что плохому танцору мешает?

Угу... Особенно, если пришли смотреть "Тодес", а на сцену выбежали "Распутина" танцевать...

Кстати, ещё кандидаты в списки плохих танцоров, не находите?:
http://ask.km.ru/plan9/doc/index.html :о)

А тут у них ваще всё, по всему видать, пораспухало:
http://www.vitanuova.com/inferno/papers/bltj.html

А вот и главный виновник:
http://www.vitanuova.com/inferno/papers/descent.html

фамилии-то все какие-то знакомые... И откуда они нам все известны? :о)))


Название: Видимость изнутри вложенного класса...
Отправлено: Evgeniy от Апреля 21, 2005, 04:57:37 pm
Wlad
фамилии-то все какие-то знакомые... И откуда они нам все известны? :о)))

(Мечтательно) : Век бы их не знать...
...Нет, не буду продолжать...