Структуры, вложенные в классы
От: Аноним  
Дата: 20.01.09 07:49
Оценка:
Здравствуйте, уважаемые.

Вопрос философского характера. Занимаемся разработкой кроссплатформенного кода с использованием wxWidgets. Хотелось бы узнать ваше мнение является ли хорошим тоном создание структур или классов, вложенных в другие классы и насколько это соответствует стандарту языка С++. Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.

Заранее благодарен, mailto:dimon-main@mail.ru
Re: Структуры, вложенные в классы
От: Bell Россия  
Дата: 20.01.09 08:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, уважаемые.


А>Вопрос философского характера. Занимаемся разработкой кроссплатформенного кода с использованием wxWidgets. Хотелось бы узнать ваше мнение является ли хорошим тоном создание структур или классов, вложенных в другие классы ...

О вкусах трудно спорить . А вообще такие вещи используютя — например при реализации идиомы pimpl.

А>...и насколько это соответствует стандарту языка С++.

9.7/1
A class can be defined within another class. A class defined within another is called a nested class.
...


А>Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.

Возможны проблемы с дружбой — попробуй поиск на "nested + friend".
Любите книгу — источник знаний (с) М.Горький
Re[2]: Структуры, вложенные в классы
От: Alexander G Украина  
Дата: 20.01.09 08:15
Оценка:
Здравствуйте, Bell, Вы писали:

А>>Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.

B>Возможны проблемы с дружбой — попробуй поиск на "nested + friend".

С другой стороны, дружба становится не так нужна, т.к. вложенному доступен внешний.
Русский военный корабль идёт ко дну!
Re: Структуры, вложенные в классы
От: Аноним  
Дата: 20.01.09 08:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.


Касается методов и членов шаблонных структур, вложенных в другие шаблонные структуры. Вернее их специализаций, приписанных внутри и вне самой шаблонной структуры.
Гдето в недрах стандарта есть четкое описание, как и где такие специализации могут быть прописаны.
GCC и MSVC ведут себя по разному. MSVC допускает некоторые вольности, не соответствующие стандарту, но если клепать по стандарту ту все отлично клепается.

Точно уже не вспомню как воспроизвести, давно это было..
Re: Структуры, вложенные в классы
От: rg45 СССР  
Дата: 20.01.09 10:37
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, уважаемые.


А>Вопрос философского характера. Занимаемся разработкой кроссплатформенного кода с использованием wxWidgets. Хотелось бы узнать ваше мнение является ли хорошим тоном создание структур или классов, вложенных в другие классы и насколько это соответствует стандарту языка С++. Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.


Тут важно четко понимать границы применимости вложенности. Если один класс является деталью реализации другого класса и требует взаимодействия с деталями реализации внешнего класса, то в этом случае имеет смысл прибегать к вложенности. Но без нужды вложенностью лучше не злоупотреблять. Если (хотя бы теоретически) класс может использоваться другими классами, это первый признак того что вложенность неприемлема. Не следует забывать, что вложенность — это усиление зависимостей между классами, что зачастую не есть хорошо. Например, невозможно сделать преварительное объявление вложенного класса за пределами внешнего. Нам прийдется подключать полностью весь заголовок с определением объемлющего класса тогда, как можно было бы обойтись простым предварительным объявлением внутреннего (отказавшись от вложенности).
--
Справедливость выше закона. А человечность выше справедливости.
Re: Структуры, вложенные в классы
От: Kluev  
Дата: 20.01.09 10:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, уважаемые.


А>Вопрос философского характера. Занимаемся разработкой кроссплатформенного кода с использованием wxWidgets. Хотелось бы узнать ваше мнение является ли хорошим тоном создание структур или классов, вложенных в другие классы и насколько это соответствует стандарту языка С++. Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.


Для вложенных классов невозможны forward declarations. Это их основной недостаток и недоработка комитета.
Re[3]: Структуры, вложенные в классы
От: -MyXa- Россия  
Дата: 20.01.09 12:15
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>С другой стороны, дружба становится не так нужна, т.к. вложенному доступен внешний.


В каком смысле?
Если не поможет, будем действовать током... 600 Вольт (C)
Re[4]: Структуры, вложенные в классы
От: rg45 СССР  
Дата: 20.01.09 13:33
Оценка: 5 (2)
Здравствуйте, -MyXa-, Вы писали:

MX>Здравствуйте, Alexander G, Вы писали:


AG>>С другой стороны, дружба становится не так нужна, т.к. вложенному доступен внешний.


MX>В каком смысле?


В том смысле, что вложенный класс имеет доступ к закрытым членам внешнего.
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: Структуры, вложенные в классы
От: Atminav  
Дата: 22.01.09 09:06
Оценка: -1
Здравствуйте, rg45, Вы писали:

R>В том смысле, что вложенный класс имеет доступ к закрытым членам внешнего.


Увы, не имеет.


11.8 Nested classes [class.access.nest]
1 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.

[Example:

class E {
  int x;
  class B { };
  
  class I {
    B b; // error: E::B is private
    int y;
    void f(E* p, int i)
    {
      p->x = i; // error: E::x is private
    }
  };

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

—end example]
Re[6]: Структуры, вложенные в классы
От: crable США  
Дата: 22.01.09 09:18
Оценка: 5 (2)
Здравствуйте, Atminav, Вы писали:

A>Здравствуйте, rg45, Вы писали:


R>>В том смысле, что вложенный класс имеет доступ к закрытым членам внешнего.


A>Увы, не имеет.



A>[code]

A>11.8 Nested classes [class.access.nest]
A>1 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.

Это давно известная ошибка в стандарте, большинство современных компиляторов выдаст ошибку только в методе E::g.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[7]: Структуры, вложенные в классы
От: Atminav  
Дата: 22.01.09 09:40
Оценка:
Здравствуйте, crable, Вы писали:

C>Это давно известная ошибка в стандарте, большинство современных компиляторов выдаст ошибку только в методе E::g.

Не знал. Когда-то давно прочитал это в стандаоте, запомнил и верил в это. Иногда молча ругался по поводу неудобств, которые возникают из-за этого правила. Большое спасибо.

Действительно, посмотрел драфт нового стандаота — там это исправлено. Тот же пример, но вместо первых двух ошибок написано "ОК".

Интересно ведет себя MSVC 6. Он сообщает о второй и третьей ошибках. То есть, закрытый тип из охватывающего класа использовать можно, а закрытый член — нельзя.
Re: Структуры, вложенные в классы
От: carpenter СССР  
Дата: 22.01.09 15:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, уважаемые.


А>Вопрос философского характера. Занимаемся разработкой кроссплатформенного кода с использованием wxWidgets. Хотелось бы узнать ваше мнение является ли хорошим тоном создание структур или классов, вложенных в другие классы и насколько это соответствует стандарту языка С++. Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.


в class view лучше смотрится проект

А>Заранее благодарен, mailto:dimon-main@mail.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.