| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > включение вложенных определений посредством includ |
| Автор: J0ker 6.5.2009, 22:00 | ||||||
| возник такой вопрос допустим имеется определение класса в который вложены определения других классов естественно все это трудно читаемо кошерно-ли вынести оперделения вложенных классов в отдельные файлы, а затем эти файлы вставить посредством #include? пример: a.def
b.def
c.h
|
| Автор: Lazin 6.5.2009, 22:31 | ||||
| а что мешает сделать так: файл detail/C.h
файл С.h
|
| Автор: J0ker 6.5.2009, 22:49 | ||
Lazin, хорошее решение, однако не всегда применимое:
...хотя можно и зафрендить... но думаю найдутся и другие недостатки |
| Автор: azesmcar 6.5.2009, 23:11 | ||||
Так не пойдет? Добавлено через 6 минут и 16 секунд J0ker Насчет варианта с индклудами - это на мой взгляд не кашерно, ибо обявление класса дублируется и несмотря на то что он обявлен в private секции методом инклуда, его обявлении прекрасно будет фигурировать в глобальном пространстве имен нарушая всю вашу инкапсуляцию |
| Автор: J0ker 7.5.2009, 01:23 | ||||
да, похоже это то, что нужно было-бы еще интересно узнать мнение UnrealMan'а - эквивалентно ли это семантически прямому включению
это каким таким образом?
каким образом оно попадет в глобальное пространство? |
| Автор: mes 7.5.2009, 01:40 | ||
В данном вопросе Вы подразумеваете, будут ли на классы описанные вышеупомянутым способом, распространяться те же правила, как если бы он был описан внутри класса-хозяина ? если да, то
|
| Автор: J0ker 7.5.2009, 06:27 |
| mes, спасибо было лень самому копать |
| Автор: azesmcar 7.5.2009, 07:04 | ||
методом прямого инклуда файла a.def не знаю можно ли это считать нарушением инкапсуляции, на самом деле если человеку не терпится навредить себе, он это сделает..ведь
еще не отменяли но в любом случае, вышеупомянутый вариант - лучше |
| Автор: J0ker 7.5.2009, 08:51 |
инклюд просто включает текст из одного файла в другой если я делаю инклюд в скопе класса, то все, что в инклюде написано попадает в скоп класса и никаким боком наружу впрочем вопрос решен уже |
| Автор: azesmcar 7.5.2009, 09:00 | ||||
А я что-то другое сказал?
теперь если я - пользователь класса сделаю у себя в начале файла #include "b.def" класс В попадет в мое глобальное пространство имен, и он не будет защищен секцией private. Я об этом. т.е. мы даем пользователю возможность включить этот файл у себя. Ничего особо страшного, но лучше этого не позволять. |
| Автор: mes 7.5.2009, 09:05 | ||
а кто разрешает пользователю инклудить "не инклудные" файлы ?! J0ker же специально обозвал его *.def В таком случае однозначно ответственность на юзере. Также как если вдруг ему захочется заинклудить *cpp файл (хотя бывают случаи и с таким применением |
| Автор: azesmcar 7.5.2009, 09:10 | ||||
ну, с большей долей вероятности при включении *cpp файла он получит ошибку времени линковки.
я только говорю что - зачем давать пользователю лишний шанс нарушить инкапсуляцию, если есть другие методы. |
| Автор: mes 7.5.2009, 09:33 | ||||||
от не сознательных действий юзера можно было бы, например, поставить защиту :
но, имхо, дело не в пользователe, а в самой постановке кода. Если есть более чистый вариант, зачем прибегать к трюкам ?! Кстати не стандартный способ инклуда достаточно част в библиотеках, даже (или тем более) в том же самом бусте, но применяется только в тех случаях, когда это действительно самое подходящее решение..
так иногда поступают, когда описывают в cpp файле реализацию методов шаблонного класса. и такие cpp шники даже если подключены к проекту, не создают ошибку линковки. Хотя имхо, в таком случае лучше было бы давать другое расширение файлу.. |
| Автор: azesmcar 7.5.2009, 09:55 | ||||
ну я и говорю
это те cpp шники которые специально для этого разработаны, я говорил не о них а об обычных. |
| Автор: mes 7.5.2009, 10:03 | ||
ну так а b.def разве не специально разработан ?! я лишь пытался уточнить, потому как чуствовалась двойная трактовка, но в принципе, да, речь об одном и том же |
| Автор: azesmcar 7.5.2009, 10:06 | ||
специально, только вот если включить те файлы шаблонных функций - то ничего не нарушится, они специально предназначены для включения в глобальное пространство имен, а наш b.def предназначен для включения в приватную секцию (хотя никто не зарпещает включить его глобально). В принципе это параноя если смотреть с практической точки зрения Но если взглянуть с теоретической точки зрения, то есть более рациональный аналог. Только и всего |
| Автор: J0ker 7.5.2009, 16:33 | ||||||
boost/mem_fn.hpp
boost/bind/mem_fn_template.hpp
|
| Автор: azesmcar 7.5.2009, 16:35 |
| J0ker mes сказал немного выше что так поступают в стандартных библиотеках..но только когда другого выхода нет. |
| Автор: J0ker 7.5.2009, 17:04 | ||||
а наш boost/bind/mem_fn_template.hpp предназначен для включения в публичную секцию (хотя никто не зарпещает включить его глобально) |
| Автор: azesmcar 7.5.2009, 17:13 | ||
Видимо у них были на то причины. Я все равно считаю это последним решением к которому можно прибегнуть. Я не изучал глубоко этот файл и не знаю причин которые могли побудить авторов написать этот код, и не могу сказать что у них был другой выбор. |