|
|
|
интерфейсы, шаблоны и фабрики
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34098717&tid=2030122]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 412ms |

| 0 / 0 |
