![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| J0ker |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
возник такой вопрос
допустим имеется определение класса в который вложены определения других классов естественно все это трудно читаемо кошерно-ли вынести оперделения вложенных классов в отдельные файлы, а затем эти файлы вставить посредством #include? пример: a.def
b.def
c.h
|
||||||
|
|||||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
а что мешает сделать так:
файл detail/C.h
файл С.h
|
||||
|
|||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
Lazin, хорошее решение, однако не всегда применимое:
...хотя можно и зафрендить... но думаю найдутся и другие недостатки Это сообщение отредактировал(а) J0ker - 6.5.2009, 22:52 |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Так не пойдет? Добавлено через 6 минут и 16 секунд J0ker Насчет варианта с индклудами - это на мой взгляд не кашерно, ибо обявление класса дублируется и несмотря на то что он обявлен в private секции методом инклуда, его обявлении прекрасно будет фигурировать в глобальном пространстве имен нарушая всю вашу инкапсуляцию |
||||
|
|||||
| mes |
|
||||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
думаю не стоит так делать. мне кажетеся Вам подойдет такой вариант :
Оп...оказывается я опоздал с предложением ;) Это сообщение отредактировал(а) mes - 7.5.2009, 00:00 |
||||||||||
|
|||||||||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
да, похоже это то, что нужно было-бы еще интересно узнать мнение UnrealMan'а - эквивалентно ли это семантически прямому включению
это каким таким образом? каким образом оно попадет в глобальное пространство? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
В данном вопросе Вы подразумеваете, будут ли на классы описанные вышеупомянутым способом, распространяться те же правила, как если бы он был описан внутри класса-хозяина ? если да, то
Это сообщение отредактировал(а) mes - 7.5.2009, 01:45 |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
mes, спасибо было лень самому копать
Это сообщение отредактировал(а) J0ker - 7.5.2009, 08:51 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
методом прямого инклуда файла a.def не знаю можно ли это считать нарушением инкапсуляции, на самом деле если человеку не терпится навредить себе, он это сделает..ведь
еще не отменяли но в любом случае, вышеупомянутый вариант - лучше |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
инклюд просто включает текст из одного файла в другой если я делаю инклюд в скопе класса, то все, что в инклюде написано попадает в скоп класса и никаким боком наружу впрочем вопрос решен уже |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
А я что-то другое сказал?
теперь если я - пользователь класса сделаю у себя в начале файла #include "b.def" класс В попадет в мое глобальное пространство имен, и он не будет защищен секцией private. Я об этом. т.е. мы даем пользователю возможность включить этот файл у себя. Ничего особо страшного, но лучше этого не позволять. Это сообщение отредактировал(а) azesmcar - 7.5.2009, 09:02 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а кто разрешает пользователю инклудить "не инклудные" файлы ?! J0ker же специально обозвал его *.def В таком случае однозначно ответственность на юзере. Также как если вдруг ему захочется заинклудить *cpp файл (хотя бывают случаи и с таким применением |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
ну, с большей долей вероятности при включении *cpp файла он получит ошибку времени линковки.
я только говорю что - зачем давать пользователю лишний шанс нарушить инкапсуляцию, если есть другие методы. |
||||
|
|||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
от не сознательных действий юзера можно было бы, например, поставить защиту :
но, имхо, дело не в пользователe, а в самой постановке кода. Если есть более чистый вариант, зачем прибегать к трюкам ?! Кстати не стандартный способ инклуда достаточно част в библиотеках, даже (или тем более) в том же самом бусте, но применяется только в тех случаях, когда это действительно самое подходящее решение..
так иногда поступают, когда описывают в cpp файле реализацию методов шаблонного класса. и такие cpp шники даже если подключены к проекту, не создают ошибку линковки. Хотя имхо, в таком случае лучше было бы давать другое расширение файлу.. Это сообщение отредактировал(а) mes - 7.5.2009, 09:40 |
||||||
|
|||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
ну я и говорю это те cpp шники которые специально для этого разработаны, я говорил не о них а об обычных. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |