Вопрос философского характера. Занимаемся разработкой кроссплатформенного кода с использованием wxWidgets. Хотелось бы узнать ваше мнение является ли хорошим тоном создание структур или классов, вложенных в другие классы и насколько это соответствует стандарту языка С++. Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, уважаемые.
А>Вопрос философского характера. Занимаемся разработкой кроссплатформенного кода с использованием 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".
Здравствуйте, Bell, Вы писали:
А>>Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией. B>Возможны проблемы с дружбой — попробуй поиск на "nested + friend".
С другой стороны, дружба становится не так нужна, т.к. вложенному доступен внешний.
Русский военный корабль идёт ко дну!
Re: Структуры, вложенные в классы
От:
Аноним
Дата:
20.01.09 08:24
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.
Касается методов и членов шаблонных структур, вложенных в другие шаблонные структуры. Вернее их специализаций, приписанных внутри и вне самой шаблонной структуры.
Гдето в недрах стандарта есть четкое описание, как и где такие специализации могут быть прописаны.
GCC и MSVC ведут себя по разному. MSVC допускает некоторые вольности, не соответствующие стандарту, но если клепать по стандарту ту все отлично клепается.
Точно уже не вспомню как воспроизвести, давно это было..
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, уважаемые.
А>Вопрос философского характера. Занимаемся разработкой кроссплатформенного кода с использованием wxWidgets. Хотелось бы узнать ваше мнение является ли хорошим тоном создание структур или классов, вложенных в другие классы и насколько это соответствует стандарту языка С++. Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.
Тут важно четко понимать границы применимости вложенности. Если один класс является деталью реализации другого класса и требует взаимодействия с деталями реализации внешнего класса, то в этом случае имеет смысл прибегать к вложенности. Но без нужды вложенностью лучше не злоупотреблять. Если (хотя бы теоретически) класс может использоваться другими классами, это первый признак того что вложенность неприемлема. Не следует забывать, что вложенность — это усиление зависимостей между классами, что зачастую не есть хорошо. Например, невозможно сделать преварительное объявление вложенного класса за пределами внешнего. Нам прийдется подключать полностью весь заголовок с определением объемлющего класса тогда, как можно было бы обойтись простым предварительным объявлением внутреннего (отказавшись от вложенности).
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, уважаемые.
А>Вопрос философского характера. Занимаемся разработкой кроссплатформенного кода с использованием wxWidgets. Хотелось бы узнать ваше мнение является ли хорошим тоном создание структур или классов, вложенных в другие классы и насколько это соответствует стандарту языка С++. Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.
Для вложенных классов невозможны forward declarations. Это их основной недостаток и недоработка комитета.
Здравствуйте, -MyXa-, Вы писали:
MX>Здравствуйте, Alexander G, Вы писали:
AG>>С другой стороны, дружба становится не так нужна, т.к. вложенному доступен внешний.
MX>В каком смысле?
В том смысле, что вложенный класс имеет доступ к закрытым членам внешнего.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, 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 privateint 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
}
};
Здравствуйте, 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.
Здравствуйте, crable, Вы писали:
C>Это давно известная ошибка в стандарте, большинство современных компиляторов выдаст ошибку только в методе E::g.
Не знал. Когда-то давно прочитал это в стандаоте, запомнил и верил в это. Иногда молча ругался по поводу неудобств, которые возникают из-за этого правила. Большое спасибо.
Действительно, посмотрел драфт нового стандаота — там это исправлено. Тот же пример, но вместо первых двух ошибок написано "ОК".
Интересно ведет себя MSVC 6. Он сообщает о второй и третьей ошибках. То есть, закрытый тип из охватывающего класа использовать можно, а закрытый член — нельзя.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, уважаемые.
А>Вопрос философского характера. Занимаемся разработкой кроссплатформенного кода с использованием wxWidgets. Хотелось бы узнать ваше мнение является ли хорошим тоном создание структур или классов, вложенных в другие классы и насколько это соответствует стандарту языка С++. Не возникнет ли проблем при переносе кода? Хотелось бы услышать ответы с аргументацией.