|
|
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Есть такая библиотека ibpp. Что-то я не пойму следующее: Есть класс Ptr, шаблон класса T. Он перегружает много операторов. Есть интерфейс IDatabase. По ним построен класс Database: Код: plaintext 1. Теперь дальше. Есть класс DatabaseImpl, который наследуется от интерфейса: Код: plaintext 1. А теперь внимание! Есть функция-фабрика, которая далает следующее: Код: plaintext 1. 2. 3. Как токое может быть? Почему возвращается Database, а не Database *? Есть две мысли, но результатов не дают: 1. Ptr перегружает кучу операторов. Но здесь эти операторы не учавствуют, вроде. Так что это наверное не оно. Пробовал иммитировать ситуацию - не удалось. 2. Опрераторы Ptr дают основание пологать, что классы по этому шаблону получаются синглетонами. Но х.з. В программе можно использовать несколько объектов одного класса. Вообще, хочу понять в чем дело и сымитировать ситуацию. Если надо что-то усточнить, вылочу необходимые исходники. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 11:47 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
тексты давай, прикольною но с первого взгляда вполне законная конструкция Ptr<T> - rfrjq-nj nbgbxysq смартпойтер. возвращают смартпойнер чтобы не вязатся с указателями и не иметь проблем с освобождением ресурсов, тут народ все по finally тосковал, вот вм типичное решение проблемы Database db; try { ... db = DatabaseFactory(...); ... } catch(...) { ... } явный delete нигде не нужен, ибо при разрушении автоматической переменной вызовется delete ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 11:59 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Вот собстна ptr. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. А это фабрика: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 12:14 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
2blinded: Мои-то вопросы актуальны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 13:14 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
это, кажется, называется конструктор копирования :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 13:27 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
или присваивания... не помню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 13:28 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
maXmoэто, кажется, называется конструктор копирования :) Ничего не понимаю. При вызове фабрики, происходит динамическое создание объекта (new), который у меня в вызывающей функции становится статическим, и должен освободиться по выходу из нее [функции]. Как реализуется этот конструктор копирования? Такая ли схема выделения памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 13:30 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 13:39 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
maXmoвызывается не оператор присваивания, а конструктор копирования Ptr(T* p). То же самое при возврате из функции. Что-то у меня такое не прокатывает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 13:47 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
вот именно, потому что ты не объявил конструктор копирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 14:08 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
maXmoвот именно, потому что ты не объявил конструктор копирования. Теперь понял, где он. Значит, сначала вызывается выделяется память под DatabaseImpl, потом вызывается его конструктор. Далее, компилятор смотрит, что вернуть надо сам объект и ищет в нем конструктор копирования, если он найден, то будет вызыватья он. В итоге получается имитация создания локального объекта, который удалится при выходе из области видимости. Вроде того? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 14:22 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
вот именно, потому что ты не объявил конструктор копирования. в примере выше есть конструктор копирования, только он неявно создан не хватет конструктора преобразования типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 14:46 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир вот именно, потому что ты не объявил конструктор копирования. в примере выше есть конструктор копирования, только он неявно создан не хватет конструктора преобразования типа: ... Сложная схема получается. Хотелось бы узнать, как с точки зрения компилятора работают эти конструкторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 15:09 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Akh, дебуг - наш бох, и step into - пророк Его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 15:10 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
maXmoAkh, дебуг - наш бох, и step into - пророк Его. Ладно, пасиб. Вообщем, открыли мне глаза, на чудо сие. Дальше и сам смогу разобраться. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 15:16 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Попробовал заменить конструктор копирования на пустой конструктор и оператор присваивания: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Компилятор не пропускает создание объекта. Мне кажется, что это более наглядная запись. Но почему она не правельная? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 17:53 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Компилятор не пропускает создание объекта. Мне кажется, что это более наглядная запись. Но почему она не правельная? потому-что A a = new Aimpl(); это альтернативная запись для A a( new Aimpl() ); // конструктор с одним параметром а не оператор присваивания ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 17:56 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир Компилятор не пропускает создание объекта. Мне кажется, что это более наглядная запись. Но почему она не правельная? потому-что A a = new Aimpl(); это альтернативная запись для A a( new Aimpl() ); // конструктор с одним параметром а не оператор присваивания Именно с этого я задумался. Но тогда, этот конструктор обычный. Что в нем такого копировательного? A a - создание нового объекта a = ... - присвоение объекту чего-то a = new Aimpl() - присвоение объекту одного класса, указателя объекта другого, т.е. A = Aimpl*. Для этого я и определил оператор. A a( new Aimpl() ) - обычное использование констурктора (T*p) A a() = new Aimpl - обычное использование конструктора () и оператор присваивания. Т.е. эти две записи, мне говорят лишь о том, что если создаваемому локальному объекту присваивается, что-то. То компилятор, проверит, есть ли у него конструктор с одним этим парметром. Т.е. отдельная фича в использовании обычных конструкторов. В эту схему может же вписаться и создание объекта без парматера и присвоение ему другого объекта(указателя)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 18:08 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
честно говоря я мало понял, что вы имеете в виду %) позволю себе два замечания: 1) существуют четкие определения: class X { X( const X& ); // копирующий конструктор X& operator=( const X& ); // копирующее присваивание }; 2) присваивание и инициализация являются различными операциями ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 18:39 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
привет! я сразу извинияюсь, ибо хожу из дома по dial-up. а потому сидеть все время в сети не могу. значит эта штука называется smartpointer с подсчетом ссылок, счетчик ссылок внедрен в сам объект. поэтому классы которые являются парметрами шаблона должны быть отнаследованы от одного класса назоввем его RefCounter у которого и реализовано ведение счетчика ссылок. класс RefCounter довольно забавный, в методе Release он вызывает собственный деструктор....(ненавижу самострелов) теперь что касается оператора return в DatabaseFactory ход мысли такой 1) тюкю функция должна вернуть Ptr<Database> комнилер подставляет создает его из указателя на DataBaseImpl. Это возможно поскольку конструктор не объявлен expicit при этом счетчик ссылок инкрементируется на 1 2) чтобы можно было вернуть значение в вызывающий модуль вызывается конструктор копирования и создается еще один ptr и счетчик ссылок увеличивается еще на 1 3) разрушается объект созданный в п 1, счетчик ссылок декрементируется 4) присвается значение из временной переменной п 2 в автоматическую переменную в вызывающем модуле, счетчик ссылок инкрементируется 5) разрушается объект из п 2 сетчик ссылок декрементируется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 21:20 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Голенков Владимирчестно говоря я мало понял, что вы имеете в виду %) позволю себе два замечания: 1) существуют четкие определения: class X { X( const X& ); // копирующий конструктор X& operator=( const X& ); // копирующее присваивание }; 2) присваивание и инициализация являются различными операциями Ответ на мой вопрос - именно п.2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 09:58 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
blinded... Получается, в итоге, что это некий контейнер синглетона, работающий с ним по определенному интерфейсу? Т.е. некий враппер на синглетон? А функциональность статичности объектов с ним никак не связана, это лишь ограничение, навиваемое фабрикой? Также фабрика абстрогирует создание синглетона и смартпоинтера, предоставляя просто статический объект. Но я, что-то не пойму плюсов этой структуры... Не проще ли, нагляднее, и надежнее работать просто с классами DatabaseImpl, наследованными от интерфейсов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 10:38 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Akh, нет там никакого синглетона. Синглетон обеспечивает единственность объекта класса в программе, в приведенном коде этого нет. Если ты повторно обратишсы к фабрике, то она с удовольствием создаст тебе еще один объект базы данных. те код типа Database db1 = DatabaseFactory(...); Database db2 = DatabaseFactory(...); if ( db1== db2 ) cout << "db1 & db2 are same"<< endl; else cout << "db1 & db2 deiffers" << endl; всегда будет выдавать db1 & db2 deiffers это просто smartpointer? который позволяет позабыть о необходимости delete ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 11:23 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
blindedAkh, нет там никакого синглетона. Синглетон обеспечивает единственность объекта класса в программе, в приведенном коде этого нет. Если ты повторно обратишсы к фабрике, то она с удовольствием создаст тебе еще один объект базы данных. те код типа Database db1 = DatabaseFactory(...); Database db2 = DatabaseFactory(...); if ( db1== db2 ) cout << "db1 & db2 are same"<< endl; else cout << "db1 & db2 deiffers" << endl; всегда будет выдавать db1 & db2 deiffers это просто smartpointer? который позволяет позабыть о необходимости delete Смутила единственность объекта DatabaseImpl внутри Ptr<IDatabase>. А что входит в понятие смартпоинтера? DatabaseImpl, Ptr<Idatabase> вместе с фабрикой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 11:35 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
ну я бы определил его так, класс шаблон, объекты которого используются только как автоматические переменные, ведут себя как обыкновенные указатели на класс-парметр шаблона. вся разумность этих указателей сводится к вызову деструктора в соотвествии с некоторй выбранной стратегией. стратегии бывают разные, например у auto_ptr ов( они же ведущие указатели) за разрушение объекта отвечает последний auto_ptr, которому было присвоено значение. в том случае который привел ты обект сам себя разрушает, как только счетчик ссылок на него достигает 0 ну а ежели хочешь подробнее - Александреску, там целая глава ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 11:47 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
blindedну я бы определил его так, класс шаблон, объекты которого используются только как автоматические переменные, ведут себя как обыкновенные указатели на класс-парметр шаблона. вся разумность этих указателей сводится к вызову деструктора в соотвествии с некоторй выбранной стратегией. стратегии бывают разные, например у auto_ptr ов( они же ведущие указатели) за разрушение объекта отвечает последний auto_ptr, которому было присвоено значение. в том случае который привел ты обект сам себя разрушает, как только счетчик ссылок на него достигает 0 ну а ежели хочешь подробнее - Александреску, там целая глава Т.е. тоже самое, что и в ibpp, только удаление объекта возложено на шаблон-враппер. Но весь смысл его применения заключается только в том, чтобы он создавался статически. Т.е. необходимо создавать тоже что-то подобное фабрикам-функциям? Александреску - "Современное проектирование на С++"? ПС: Уже давно нашел банду четырех, но никак не могу для нее выделить время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 12:16 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
смартпоинтеры созданы для автоматизации подсчёта ссылок. Александреску не читал, но в Inside COM эта проблема поставлена хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 15:44 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
На каждый AddRef должен приходиться один Release и вручную сводить этот баланс - всё равно что явное управление памятью вместо сборки мусора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 15:47 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
maXmoсмартпоинтеры созданы для автоматизации подсчёта ссылок. Александреску не читал, но в Inside COM эта проблема поставлена хорошо. Тады, получается, синглетон включает в себя смартпоинтер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 15:50 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
да не, не думаю, смартпоинтеры придумали для кома когда прогеры опухли везде писать эти AddRef и Release (это приводило к сложноотлавливаемым багам в виде утечки памяти). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 16:25 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
maXmoда не, не думаю, смартпоинтеры придумали для кома когда прогеры опухли везде писать эти AddRef и Release (это приводило к сложноотлавливаемым багам в виде утечки памяти). Пока есть чуть времени открыл Александрески на смартпоинтерах. Вообщем, он излогает, что смартпоинтер решает задачу владения указателем на конкретный объект класса, представляя его единственным в программе. Отличие от синглетона, получается только в том, что синглетон, как я его понимаю, решает задачу владения указателем на единственный объект класса, обеспечивая эту самую единственность. Т.е. синглетон - частный случай смартпоинта. Разница только в статиках. У смартпоинтера стратегия и указатель на объект не статик, а у синглетона - статик. Вот и все. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 16:44 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Ну, и еще стратегия у синглетона - одна, а у смартпоинтера могут быть разные. По любому синглетон - частный случай смартпоинтера. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 16:46 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
AkhНу, и еще стратегия у синглетона - одна, а у смартпоинтера могут быть разные. По любому синглетон - частный случай смартпоинтера. ;) неправильно ты понял. ты почему то смотришь на код, код деуствительно может быть похож. идеи абсолютно разные. сматпойнтеры используются исключительно для автоматизации управления ресурсами. синглетон же нужен для обеспечения единственнвенности объекта класса, смомента первого обращения к нему и до завершения программы. единственное что их роднит - это что оба они шпблонные врапперы, но не более того. кстати смартпойнтеры никакого отношения к COM не имеют, не надо приписывать все заслуги дяде Билли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 20:20 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
AkhПо любому синглетон - частный случай смартпоинтера. ;) Угум, особливо синглетон Майерса Ты как-то не очень внимательно читал Александреску :( Та ДУРНАЯ реализация, что предложила банда, отнюдь не единственно возможная реализация синглетона ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2006, 08:26 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
blinded AkhНу, и еще стратегия у синглетона - одна, а у смартпоинтера могут быть разные. По любому синглетон - частный случай смартпоинтера. ;) неправильно ты понял. ты почему то смотришь на код, код деуствительно может быть похож. идеи абсолютно разные. сматпойнтеры используются исключительно для автоматизации управления ресурсами. синглетон же нужен для обеспечения единственнвенности объекта класса, смомента первого обращения к нему и до завершения программы. единственное что их роднит - это что оба они шпблонные врапперы, но не более того. кстати смартпойнтеры никакого отношения к COM не имеют, не надо приписывать все заслуги дяде Билли. Ладно. Раз, говоришь, не правельно предствставляю, значит так оно есть. Надо больше книжки читать. Позволю себе замечание: я не на код смотрю, а на средства, или методики, которые они используют. Т.е. пытаюсь разбить на шаблон на части, и провести между ними параллель. Например, смартпоинтер (владение объектом) использует стратегию передачи/владения объектом и его интерфейс (к примеру), а синглетон (ограничитель количества объектов класса) использует стратегию и тоже интерфейс. Это примерный, мною представляемый вид. Отсюда я и веду параллели. Ну, а для конструктивного разговора на эту тему, у меня, видать не достаточно знаний. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2006, 09:42 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) AkhПо любому синглетон - частный случай смартпоинтера. ;) Угум, особливо синглетон Майерса Ты как-то не очень внимательно читал Александреску :( Та ДУРНАЯ реализация, что предложила банда, отнюдь не единственно возможная реализация синглетона Совственно, я из Александреску читаю с вчерашнего дня только главу интеллектуальных указателей, а из банды еще не успел ни одного шаблона прочитать. К сожалению, не распалогаю таким объемом времени, необходимым для прочтения этих книг. Вот и читаю урывками "по ситуации". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2006, 09:46 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
2 Akh Обязательно прочитай и ту и другую до конца хотя бы один раз. Они стоят того чтобы потратить на них время. IMHO КОНЦЕПТУАЛЬНО синглетон и прокси не имеют ничего общего, но некоторые реализации синглетона могут быть похожи на прокси ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2006, 11:09 |
|
||
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)2 Akh Обязательно прочитай и ту и другую до конца хотя бы один раз. Они стоят того чтобы потратить на них время. IMHO КОНЦЕПТУАЛЬНО синглетон и прокси не имеют ничего общего, но некоторые реализации синглетона могут быть похожи на прокси Найду, потрачу. :) На счет концептуально не спорю, имею ввиду логическую структуру. Но надо начитаться, чтобы иметь четкое представление идеологии обсуждаемых шаблонов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2006, 11:14 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2030122]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 471ms |

| 0 / 0 |
