|
|
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Можно ли сделать фабрику, которая создает объекты без их перебора в switch’е Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. Есть мысль сделать что-то такое (в зависимости от значения type срабатывет нужный инициализатор): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Может, есть решения получше? Намекните, где посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 17:41 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Делается статическая файбрика, куда прописываются функции на создание и удаление объектов. Посмотрите на этом форуме. Пару месяцев назад я этот вопрос задавал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 18:08 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
тынц. У меня в качестве аргумента выступает строка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 18:09 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
AkhДелается статическая файбрика, куда прописываются функции на создание и удаление объектов. Посмотрите на этом форуме. Пару месяцев назад я этот вопрос задавал. Хорошее решение - называется "полиморфные фабрики", только придется руками прописывать функции инициализации для каждого класса (см. первое письмо, код № 2). Как раз этого и хотелось бы избежать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 07:35 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
М-да а кто кроме тебя может проинициализировать фабрику? По-моему ты хочешь странного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 10:05 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Это похоже на то, как я тогда бился головой об стенку, пытаясь найти средства как найти в программе нужные мне объекты. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 10:20 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
JustVas AkhДелается статическая файбрика, куда прописываются функции на создание и удаление объектов. Посмотрите на этом форуме. Пару месяцев назад я этот вопрос задавал. Хорошее решение - называется "полиморфные фабрики", только придется руками прописывать функции инициализации для каждого класса (см. первое письмо, код № 2). Как раз этого и хотелось бы избежать. А чем вас не устраивают макросы от blinded? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 10:21 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
AkhА чем вас не устраивают макросы от blinded? Потому что это то же самое перечисление врукопашную. А вот готовое решение. Те же полиморфные фабрики, однако с саморегистрацией через статическую инициализацию. Код: 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. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 11:39 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
JustVasНарод! Покритикуйте, pls. тот же самый закат солнца в ручную (классы Int1, Int2). Минусы: - Инентификация класса по типу возложена на класс, а не на фабрику - Создание/инициализация объекта возложена на сам объект, а не на объект инициализации фабрики ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 11:52 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
У самого вопрос возник. Как говорит стандарт о том, есть ли установленный порядок инициализации указателей и создании классов? Т.е. есть гарантия, что Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 11:56 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Akh JustVasНарод! Покритикуйте, pls. тот же самый закат солнца в ручную (классы Int1, Int2). Минусы: - Инентификация класса по типу возложена на класс, а не на фабрику Иначе получится один большой switch, от которого и стараюсь избавиться. В этом же решении создание нового класса не ведет к необходимости изменения фабрики Akh- Создание/инициализация объекта возложена на сам объект, а не на объект инициализации фабрики Это хорошо, т.к. вызов нужного конструктора, чтение/запись и другие специфичные для класса действия лучше доверить самому классу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:03 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
AkhУ самого вопрос возник. Как говорит стандарт о том, есть ли установленный порядок инициализации указателей и создании классов? Т.е. есть гарантия, что Код: plaintext Код: plaintext В единице трансляции инициализация идет в той последовательности, как пишется. Правда, потом компоновщик может все перековеркать в зависимости от того, в какой последовательности стоят *.obj (хотя на этот момент стандарт ничего не говорит) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:09 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
JustVas Akh JustVasНарод! Покритикуйте, pls. тот же самый закат солнца в ручную (классы Int1, Int2). Минусы: - Инентификация класса по типу возложена на класс, а не на фабрику Иначе получится один большой switch, от которого и стараюсь избавиться. В этом же решении создание нового класса не ведет к необходимости изменения фабрики Akh- Создание/инициализация объекта возложена на сам объект, а не на объект инициализации фабрики Это хорошо, т.к. вызов нужного конструктора, чтение/запись и другие специфичные для класса действия лучше доверить самому классу 1. Фабрике можно передавать тип, она в вектор будет загонять структуру с типом и функцией инициализации. Потом поиском будет искать. Фабрику не надо будет изменять, свича не будет. 2. На счет вызова нужного конструктора, думаю, это должна делать сама фабрика по типу. 3. На счет чтения записи, не совсем понял про что вы, но этими делами должен заниматься сам конструктор. Т.е. Волки отдельно, овцы отдельно. Созданием объекта, объект заниматься не должен, этим должна заниматься фабрика с помощью дополнительного объекта. Инициализацияей себя, объект должен заниматься сам, т.к. это его дело, а не всякие посторонние объекты; он лучше знает, что ему делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:13 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
JustVas AkhУ самого вопрос возник. Как говорит стандарт о том, есть ли установленный порядок инициализации указателей и создании классов? Т.е. есть гарантия, что Код: plaintext Код: plaintext В единице трансляции инициализация идет в той последовательности, как пишется. Правда, потом компоновщик может все перековеркать в зависимости от того, в какой последовательности стоят *.obj (хотя на этот момент стандарт ничего не говорит) Если нет четкого ограничения, то плохо. Если бы было так, как я сказал, то создание вектора при первом запуске установке функции инициализации решало бы проблему с синхронизацией создание_списка-добавление_в_список. Да, кстати, глобальный A *a=NULL, по моему, инициализируется еще до запуска исполнияемого файла, т.к. уже лежит в нем. Так было в ассемблере, так, наверное, и в сях. Так что это еще вам один минус. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:25 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Akh 1. Фабрике можно передавать тип, она в вектор будет загонять структуру с типом и функцией инициализации. Потом поиском будет искать. Фабрику не надо будет изменять, свича не будет. 2. На счет вызова нужного конструктора, думаю, это должна делать сама фабрика по типу. 3. На счет чтения записи, не совсем понял про что вы, но этими делами должен заниматься сам конструктор. Т.е. Волки отдельно, овцы отдельно. Созданием объекта, объект заниматься не должен, этим должна заниматься фабрика с помощью дополнительного объекта. Инициализацияей себя, объект должен заниматься сам, т.к. это его дело, а не всякие посторонние объекты; он лучше знает, что ему делать. Возникает чувство, что мы слегка друг друга не понимаем. Я говорю не про классическую "голую" фабрику, а про "полиморфную". В ней каждый класс имеет свою "минифабрику", адрес которой записывается в "головной" фабрике. Задача "головной" фабрики - вызвать нужную "мини". Все это в "БандеЧетырех" есть, вот только не нравится, что инициализация массива "головной" фабрики вручную делается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:32 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
AkhДа, кстати, глобальный A *a=NULL, по моему, инициализируется еще до запуска исполнияемого файла, т.к. уже лежит в нем. Так было в ассемблере, так, наверное, и в сях. Так что это еще вам один минус. ;) Так и есть. А что в этом плохого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:37 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
JustVasВозникает чувство, что мы слегка друг друга не понимаем. Я говорю не про классическую "голую" фабрику, а про "полиморфную". В ней каждый класс имеет свою "минифабрику", адрес которой записывается в "головной" фабрике. Задача "головной" фабрики - вызвать нужную "мини". Все это в "БандеЧетырех" есть, вот только не нравится, что инициализация массива "головной" фабрики вручную делается Большой звиняй тогда. А я то все думаю, что за полиморфность... Может стоит попробовать реализовать фабрики классов внутри головной фабрики, путем использования в головной вектор векторов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:38 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
JustVas AkhДа, кстати, глобальный A *a=NULL, по моему, инициализируется еще до запуска исполнияемого файла, т.к. уже лежит в нем. Так было в ассемблере, так, наверное, и в сях. Так что это еще вам один минус. ;) Так и есть. А что в этом плохого? Тогда надо делать головной вектор динамически, при первом вызове функции добавления в фабрику. Не будет проблем с тем, что бы он создавался первым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:41 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Тогда надо делать головной вектор динамически, при первом вызове функции добавления в фабрику. Не будет проблем с тем, что бы он создавался первым. Мейерс предлагал локальный статический объект в функции, возвращающей на него ссылку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:46 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир Тогда надо делать головной вектор динамически, при первом вызове функции добавления в фабрику. Не будет проблем с тем, что бы он создавался первым. Мейерс предлагал локальный статический объект в функции, возвращающей на него ссылку Хитро. Придумают же! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:52 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир Тогда надо делать головной вектор динамически, при первом вызове функции добавления в фабрику. Не будет проблем с тем, что бы он создавался первым. Мейерс предлагал локальный статический объект в функции, возвращающей на него ссылку Стоп! А нафиг, если этот вектор все равно в классе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:53 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Стоп! А нафиг, если этот вектор все равно в классе? это просто техника решения проблем порядка инициализации статических нелокальных объектов, каковым представляется фабрика ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 13:25 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир Стоп! А нафиг, если этот вектор все равно в классе? это просто техника решения проблем порядка инициализации статических нелокальных объектов, каковым представляется фабрика В моем варианте указатель на вектор содержится в фабрике, у Мейерса, я так понимаю, он содержится в дополнительном локальном классе. Какие здесь плюсы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 13:34 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
В моем варианте указатель на вектор содержится в фабрике, у Мейерса, я так понимаю, он содержится в дополнительном локальном классе. Какие здесь плюсы? чо-то я Вас запутал.. есть фабрика - глобальный объект некого класса, синглтон если желаете внутри у него м.б. вектор или мэп, не суть у него есть интерфейс: зарегистрировать функцию создания объекта некого класса и создать объект из ранее зарегистрированных типов ну собственно и вылезает проблема инициализации фабрики перед первым ее использованием, которая решается как я написал если я что недопонял, извините ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 13:45 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Голенков Владимирчо-то я Вас запутал.. Да похоже на то. Фабрику я тоже такую же имел ввиду. Можно разжевать следующее?: ;) Мейерс предлагал локальный статический объект [чего?] в функции [какой?], возвращающей на него [кого?] ссылку. А то у меня несколько вариантов (про инициализацию вектора, запуск функции и, [о, боже!] способ добавления в фабрику) и пытаясь куда-то это присобачить, крыша едет. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 13:58 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#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. 25. 26. 27. 28. 29. 30. 31. 32. в модулях конкретных классов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 14:50 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Голенков Владимирмодифицированный пример простой фабрики из Александреску: ... А гарантия, что конструктор m_callbacks вызовется до m_callbacks.insert? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 15:26 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
В дельфях можно что-то подобное: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Кто знает, можно ли в C++ сделать подобное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 15:29 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
А гарантия, что конструктор m_callbacks вызовется до m_callbacks.insert? "мамой клянусь" :) на момент вызова метода объект CFactory уже создан и инициализорован, ровно как все его подобъекты, разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 15:35 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир А гарантия, что конструктор m_callbacks вызовется до m_callbacks.insert? "мамой клянусь" :) на момент вызова метода объект CFactory уже создан и инициализорован, ровно как все его подобъекты, разве нет? _instance является локальным объектом, создается который при входе в метод, но он является еще и статическим, значит создаваться он при входе не будет. А будет, значит, он создаватья когда и другие глобальные объекты. Создаваться это у нас - выделение памяти и вызов конструктора. Также, registered глобальный - выделение памяти и вызов функции. Получается, что они равноправны. Так я думаю. ПС: И все таки скребут кошки на счет статика в статике... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 15:56 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Голенков Владимирмодифицированный пример простой фабрики из Александреску: А где CFactory::Create (как нужный объект получить)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 15:58 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Makar4ikВ дельфях можно что-то подобное: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Кто знает, можно ли в C++ сделать подобное? Нарпимер, изменив массив на массив функций создания класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 16:02 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Makar4ikВ дельфях можно что-то подобное: .... Кто знает, можно ли в C++ сделать подобное? Нельзя - "class of " нету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 16:05 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Barlone Голенков Владимирмодифицированный пример простой фабрики из Александреску: А где CFactory::Create (как нужный объект получить)? В мапе ищещь, отдаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 16:06 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
AkhНарпимер, изменив массив на массив функций создания класса.Ну так-то конечно. Только эти функции еще написать надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 16:11 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
_instance является локальным объектом, создается который при входе в метод, но он является еще и статическим, значит создаваться он при входе не будет. "Конструктор локального статического объекта вызывается один раз при первом выполнении инструкции, содержащей определение объекта." Страуструп, C++ 3е издание, [10.4.8] "Этот подход основан на том, что C++ гарантирует: локальные статические объекты инициализируются в первый раз, когда определение объекта встречается при вызове этой функции." Мейерс, Эффективное использование C++ 3е издание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 16:40 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир _instance является локальным объектом, создается который при входе в метод, но он является еще и статическим, значит создаваться он при входе не будет. "Конструктор локального статического объекта вызывается один раз при первом выполнении инструкции, содержащей определение объекта." Страуструп, C++ 3е издание, [10.4.8] "Этот подход основан на том, что C++ гарантирует: локальные статические объекты инициализируются в первый раз, когда определение объекта встречается при вызове этой функции." Мейерс, Эффективное использование C++ 3е издание Да, признаю. Много в С++ оговорок, которые логически трудно/невозможно вывести. ПС: Подход очень хороший. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 16:59 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
в приведенном мной примере функция CFactory::Instance() не должна быть inline ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 10:28 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
Можно тут "крупному" специалисту встрять? Что касается полиморфной фабрики жестко связянной с некоторой иерархией классов, как того хотел автор топика. мне кажется это не совсем правильным 1) иногда бывает необходимо производить обекты классов не всего дерева насладования, а только его поддерева 2) и это у меня очень часто бывало за разными значениями ключа кроется одинаковые производящие функции Например OCI от oracle 8 закрывали, ну возвращает мне из описания таблицы отн тип данных char, varchar2 или другой символьный тип а в С++ все равно char[] заводить Ну а что касается представленной фабрики не вижу никаких преимуществ перед совместным с Akh'ом творением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 12:30 |
|
||
|
фабрика
|
|||
|---|---|---|---|
|
#18+
blindedМожно тут "крупному" специалисту встрять? Что касается полиморфной фабрики жестко связянной с некоторой иерархией классов, как того хотел автор топика. мне кажется это не совсем правильным 1) иногда бывает необходимо производить обекты классов не всего дерева насладования, а только его поддерева 2) и это у меня очень часто бывало за разными значениями ключа кроется одинаковые производящие функции Например OCI от oracle 8 закрывали, ну возвращает мне из описания таблицы отн тип данных char, varchar2 или другой символьный тип а в С++ все равно char[] заводить Ну а что касается представленной фабрики не вижу никаких преимуществ перед совместным с Akh'ом творением Я вижу преимущество в гарантии инициализации всех данных фабрики в момент первой записи информации о классе. На счет не правельности, не понял смысл ссылок на деревья классов (т.к. не полносьтю представляю определение полиморфных фабрик). Полиморфная фабрика, как я себе понял, это фабрика, имеющая/предоставляющая информацию о средстве получения информации о вариантах создания объекта. Это средство информации, предоставляет функции работы над классами тоже по какому-то идентификатору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 12:43 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2030307]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
451ms |
get topic data: |
11ms |
get forum data: |
4ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 226ms |
| total: | 766ms |

| 0 / 0 |
