![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Написал констуктор классу:
Хотелось бы узнать, что думает матерый С++ - гуру ? ;) Т.е. с высоты нескольких лет использования ++. Отмечу, что тут do - whihe нужен для того чтоб свести обработку и корректный откат в одно место! ;) |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
Это God-Constructor, разновидность God-Function
|
|||
|
||||
ISergeyN |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
|
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
ISergeyN, Сделано было специально, потому что думаю что если передам char *, то ахтунг ) Может и ошибаюсь,
Пример, будет ли это работать с добавлением "&" ? : cDriver drvr("Cthulhu.sys"); или надо будет: cDriver drvr(std::string("Cthulhu.sys") ); ? Более, того. Вы предлагаете ссылку, а значит в конструкторе нужно ссылаться на конкретный объект! А что если перечислю список дров для тестировани из ини-файла и удалю их потом ,т.е. все будет в динамике, то на что ссылаться то? Потому мне кажется лучше по значению, а не ссылке ) |
|||
|
||||
ISergeyN |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
http://codepad.org/tPCL89kP |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
EvilsInterrupt, стандартный способ передачи СЛОЖНЫХ объектов в качестве параметра - по константной ссылке. Твои страхи беспочвенны. у std::string конструктор от const char* не explicit, поэтому передавать строковые литералы можно.
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Не советую выбрасывать исключения из конструктора - дурной тон
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
borisbn, Почему? То что не производительно по скорости выполнения согласен, но почему дурной тон? Если объект был должен создан, а он не создался, то что? Это разве просто ошибка? Нет! Это исключительная ситуация!
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
EvilsInterrupt, под руками нет отладчика (к сожалению не помню) чтобы проверить, вызовется ли в этом случае деструктор. А если и вызовется, то как ему удалять наполовину созданный объект. IMHO в ситуации, когда может произойти исключительная ситуация создать отдельную функцию инициализации.
Хотя, ладно, согласен, что и так можно. Просто у нас на фирме это - дурной тон (мы используем Qt, и потихоньку начинаем перенимать их стиль) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
мало того - опасно!
и еще пример
тут конечно можно использовать std::uncaught_exception(), но зачем это нужно?
Это сообщение отредактировал(а) azesmcar - 20.6.2010, 09:55 |
||||||
|
|||||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
эм... мне кажется или кто-то путает конструктор с деструктором?
ибо в деструкторе да, исключения бросать нельзя. а в конструкторе это единственно верный способ сообщить об ошибке. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
черт, написано конструктор, прочитал деструктор ![]() ну так мой пример про деструкторы ![]() Добавлено через 2 минуты и 12 секунд неправильно прочитал, исправляюсь ничего дурного в этом нет. ![]() |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
>>Это God-Constructor, разновидность God-Function
не совсем понял, что вы хотели сказать? ;) Намек на то что мне нужно поискать эти термины и после прочтения пойму, что мой конструктор подходит под то что пишут опытные С++-программеры? >>а в конструкторе это единственно верный способ сообщить об ошибке. это не только единственный, это лучше не придумаешь! Нахрена скажите человеку идти в магазин за хлебом, если он забыл дома кошелек? Если в мире людей еще можно надеяться, что кто-то пожалеет или даст в долг, то в мире программ надеяться на что-то никак нельзя! Если от чего-то зависит нарушение достижения основной цели программы, то это "чего-то" исключительная и мало того экстренная ситуация. Ошибку можно не проверить, а вот исключение оставить обработанным никак нельзя! >> под руками нет отладчика (к сожалению не помню) чтобы проверить, вызовется ли в этом случае деструктор. А если и вызовется, то как ему удалять наполовину созданный объект. Простите но бред! Объект или создается или не создается и объект считается созданным, только тогда, когда отработала не только секция инициализация конструктора, т.е. после двоеточия, но и само тело! 1) Деструктор будет вызван исключительно только у созданного объекта и никак иначе! 2) Для внутренних объектов деструктор вызывается не только, когда удаляется сам объект содержащий, но также и тогда, когда не завершилось тело конструктора,к примеру бросили исключение в тело и после обработки его, решено удалить, тогда произойдет откат создания внутренних, за исключением действий по выделению ресурсов в теле конструктора 3) Для этого нужно все что выделил удалить самому! >>cDriver::cDriver(const std::string &filename) учту спасибо!!! Но к вам вопрос. Что если я хочу в методе вернуть std::string, как лучше это осуществить? По значению, по указателю или ссылке на созданный внутри спомощью new ? Это сообщение отредактировал(а) EvilsInterrupt - 20.6.2010, 11:13 |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Output:
http://codepad.org/knrUAMBO Это сообщение отредактировал(а) borisbn - 20.6.2010, 10:58 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
borisbn, С какой целью вы привели свой код? ;) Если просто показать, что ничего такого в бросании ислкючений в конструкторе, то по-моему уже два поста, + мой сегодняшний говорят о том что :
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
EvilsInterrupt, с целью показать, что файл, открытый в конструкторе дочернего объекта FileOpener, не закроется, если выбросить исключение из A:A().
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
EvilsInterrupt |
|
||||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
>>EvilsInterrupt, с целью показать, что файл, открытый в конструкторе дочернего объекта FileOpener, не закроется, если выбросить исключение из A:A().
Дело в том что то что сделано до работы тела вашего конструктора, откатится само! ;) А все что сделано в вашем теле, вами в ручную так сказать, то в случае ошибки перед выбрасыванием исключения , вы должны откатить сами!!! Об этом я и писал:
и:
|
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
EvilsInterrupt, OK, судя по всему мы не прийдём к общему мнению, и каждый останется при своём. Мне кажется, что действия по удалению/очищению/откату следует делать в деструкторе, а не в конструкторе. Заметьте, что я не говорил, что нельзя выбрасывать исключения из конструктора, я лишь говорил, что это - дурной тон, причём с добавлением:
Предлагаю за сим hollywar закончить ![]() Это сообщение отредактировал(а) borisbn - 20.6.2010, 12:32 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
P.S. Sorry за
![]() ISergeyN, а как ты в своём первом посте выделил фон символа & -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
borisbn, Если излишне к Вам.. прошу простить. Просто люблю аргументацию, от которой не отвертеться ;) Из всего приведенного мною выше на ваши ответы, у меня только один ответ : Как вы поступаете , если выделены\получены\открыты ресурсы в теле конструктора , а под конец скажем из 5 успешных действий у вас вдруг отработали только 3, что тогда ?
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Удаляю/отдаю/закрываю только те, для которых всё было успешно выделено.
Подписываюсь, но в случае, когда под аргументами есть неоспоримые доказательства. Согласен ? ![]() Это сообщение отредактировал(а) borisbn - 20.6.2010, 13:40 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
EvilsInterrupt, почитайте про RAII
|
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
>> EvilsInterrupt, почитайте про RAII
А это :
не попадает под RAII ? Захват ресурса в точке инициализации, потом проверка ;) или чтото не так? |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не подпадает.. освобождаться ресурсы должны автоматически в деструкторе..
Добавлено через 1 минуту и 18 секунд
http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%...%86%D0%B8%D1%8F |
||||
|
|||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Получение?
Вот:
совмещено с инциализацией! >>а освобождение — с уничтожением объекта. Деструктор не привел, тема про конструктор!!! То что не приведено еще не означает, что не написано совсем, но спасибо за напоминание ;) Это RAII ! т.к. получение в секции инициализации. Только одно многие забывают, что деструктор не будет вызван , если тело вашего конструктора не отработало полностью!!! Таким образом бросая исключение вы лишаете себя работы деструктора и это означает, что именно вы берете на себя отвественность за освобождение ресурсов в случае некорректного создания объекта. Об этом-то я и писал выше в посте |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
при бросании исключении в конструкторе деструктор для этого объекта действительно не будет вызван, но вот деструкторы членов объекта - будут
в данном случае, если бы m_hSCManager имел деструктор, в котором был вызов CloseServiceHandle, не пришлось бы вручную его вызывать ни в деструкторе, ни в обработке ошибки в конструкторе -------------------- qqq |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
>>но вот деструкторы членов объекта - будут
Об этом я и писал, вот:
>>в данном случае, если бы m_hSCManager имел деструктор, в котором был вызов CloseServiceHandle, не пришлось бы вручную его вызывать ни в деструкторе, ни в обработке ошибки в конструкторе Да, согласен! Но в данной ситуации это не объект класса, а хэндл полученный в результате вызова Win32(Wow64) функции! Поэтому-то мне и надо откатываться самому вызовом CloseServicHandle, т.к. за меня никто этого не сделает !!! |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не туда смотрите.. речь не об объекте, конструктор которого Вы привели..в данном случае он нам не интересен.. Речь о "технологии " примененной внутри конструктора .. При проектированнии в стиле RAII не пришлось бы так нагружать логику конструктора.. ![]() Добавлено через 2 минуты и 2 секунды
Так вместо того чтоб в каждом месте использовать сырой хэндл, легче в одном месте написать обертку - и сразу разгрузиться все остальное ![]() |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
EvilsInterrupt, это делается так:
|
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Ни Макконнелла, случайно, начитались? -------------------- |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
>>Ни Макконнелла, случайно, начитались?
Нет, надоело при обработке очередной ошибке делать откат уже успешно завершенных действия, а по сути тело-движения по зачистке повторяются. Поэтому стал сводить в одно место. ) >>Таким образом, если у тебя дойдет до конструктора объекта, содержащего объект класса CSMHandle, то значит handle валиден. В противном случае будет кинуто исключение. Согласен будет! Но! Для этого вам придется писать класс-обертку, для получения валидного хэндла. А по сути этот враппер будет использоваться исключительно один раз, классом cDriver! Если бы два и более класса использовали враппер,то целесообразность вижу, т.к. повторное использование. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
целесообразность в образе мысли.. bsa привел вариант исполнения.. вполне возможно это реализовать и по другому.. суть в том, что Вы должны в уме сначале спроектировать взаимоотношения, а потом уже выразить на ЯП.. По примеру констуктора видно, что в глубину взаимотношений вы не заглянули, а решали сразу поверхностными средствами.. ![]() P.S. пытался показать в чем у Вас ошибка проектирования.. Добавлено через 5 минут и 28 секунд А Вы попробуйте написать так и сравните с тем, что было у Вас... Отсутствие всей этой надуманности с while уже стоит написания обертки.. |
|||
|
||||
EvilsInterrupt |
|
||||||||||||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
mes, В приведенной вами ссылке на RAII. Смотрю код и играю в игру "найди отличия" ?:
у меня это:
у него:
у меня:
у него:
у меня:
Что, не так? >>Отсутствие всей этой надуманности с while уже стоит написания обертки.. Даже если убрать обработку ошибки OpenSCManagerA в класс обертку все равно придется : I. Либо Iбросать три раза исключения: 1) имя файла не задано 2) не вернулось полное имя файла 3) невыделилось имя файла без расширение. II. Либо все свести к do - while и киданию исключения в одном месте Мне почему-то куда привычней второй вариант чем размазывать по коду генерацию исключений ;) >>P.S. пытался показать в чем у Вас ошибка проектирования.. Стараюь перенять ваш опыт! ;) Греки тоже вон спорили. спорили и как у них здорово наука вперед шагнула! ;) Это сообщение отредактировал(а) EvilsInterrupt - 20.6.2010, 17:02 |
||||||||||||
|
|||||||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
"у него" не было ресурсов за которыми нужно следить вручную ![]() Добавлено через 3 минуты и 56 секунд это не суть важно.. можно как один , так и несколько..зависит от видения программиста .. ![]() Добавлено через 5 минут и 1 секунду в общем Вам в конструкторе нужно убрать все то, что "притянуто туда за уши" ![]() |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
mes, все бы хорошо, если бы это один хэндл, то я бы возможно и последовал решению который вы указываете, к примеру заюзав код BSA. Но в этом же классе используется и другой хэндл от созданного\открытого сервиса, которому нужен валидный хэндл от OpenSCManager'a полученный в cSChandle и если его тоже делать через этот RAII , то потребуется указать хэндл от CSChandle , который указан в качестве приватного. А мы знаем, что компилятор вправе строить код по своему усмотрению,следовательно нет никакого гарантии, что cSChandle создастся быстрее чем класс-обертка вокруг открытия\создания сервиса.
если же хэндлы лежат в сыром виде, то это куда удобнее, пока, для меня ;) ЗЫ: Это кажется уже на другую тему тянет ) |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не пойму при чем тут приватный ?.. Не знаю каких "мы" Вы имели ввиду, но мы знаем, что порядок создания членов класса регламентирован, также как и порядок их удаления.. ![]() Добавлено через 3 минуты и 34 секунды
да никто Вас не заставляет отказываться сразу от "сырых".. Просто попытайтесь представить красивую картину действия и ее опишите.. не нам же за Вас напрягаться ![]() |
||||
|
|||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
>>Не знаю каких "мы" Вы имели ввиду, но мы знаем, что порядок создания членов класса регламентирован, также как и порядок их удаления..
я имею ввиду:
В этом случае мы не можем четко говорить о том что создание m_Res1 произойдет первым, а m_Res2 вторым! Поэтому при ситуации, когда класс cClass1 нуждается в открытом класс m_Res2 , а тот в свою очередь нуждается в отрытом m_Res1, мы получим багу ! ;) Вот именно такая у меня сейчас ситуация. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]() |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну ладно "уговорили".. гляну еще раз код.. и прокомментирую
дальнейшие советы будут, после того как представите исправленный код ![]() |
|||
|
||||
EvilsInterrupt |
|
||||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Спрошу еще один вопрос, что лучше:
или:
? |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
конечно второе.. но по сути любая проверка имени должна проводится в отдельной функции
![]() Добавлено через 1 минуту и 3 секунды P.S. только "<=1" и "empty()" не одно и то же.. |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
>>P.S. только "<=1" и "empty()" не одно и то же..
оно-то понятно, если в общем случае ))) Но в данном случае одно и тоже, т.к врядли кто будет создавать имя файла из одного символа! ;) ЗЫ: У меня полностью поменялся дизайн библиотеки ))) Особенно после сегодняшних советов BSA в аське ))) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |