Зарегистрировать класс в абстрактной фабрике
От: Аноним  
Дата: 03.09.08 12:20
Оценка:
Как сделать правильно? Т.е. есть некий модуль к примеру в котором хранится класс, cpp и h. Надо сделать так чтобы он сам при запуске программы зарегистрировался в фабрике..
Фабрику делаю не через шаблон а через прототип(те перегружный Clone в каждом объекте).
Возможно должен быть какой то статический вспомогательный объект чтоб у нег вызывался конструктор при старте. Но хз как и куда это вс подскажите плз
Re: Зарегистрировать класс в абстрактной фабрике
От: Анатолий Широков СССР  
Дата: 03.09.08 13:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Как сделать правильно? Т.е. есть некий модуль к примеру в котором хранится класс, cpp и h. Надо сделать так чтобы он сам при запуске программы зарегистрировался в фабрике..

А> Фабрику делаю не через шаблон а через прототип(те перегружный Clone в каждом объекте).
А> Возможно должен быть какой то статический вспомогательный объект чтоб у нег вызывался конструктор при старте. Но хз как и куда это вс подскажите плз

В качестве примера: http://www.rsdn.ru/Forum/message/130926.1.aspx
Автор: Анатолий Широков
Дата: 13.11.02
Re[2]: Зарегистрировать класс в абстрактной фабрике
От: Аноним  
Дата: 03.09.08 13:36
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Здравствуйте, Аноним, Вы писали:


А>> Как сделать правильно? Т.е. есть некий модуль к примеру в котором хранится класс, cpp и h. Надо сделать так чтобы он сам при запуске программы зарегистрировался в фабрике..

А>> Фабрику делаю не через шаблон а через прототип(те перегружный Clone в каждом объекте).
А>> Возможно должен быть какой то статический вспомогательный объект чтоб у нег вызывался конструктор при старте. Но хз как и куда это вс подскажите плз

АШ>В качестве примера: http://www.rsdn.ru/Forum/message/130926.1.aspx
Автор: Анатолий Широков
Дата: 13.11.02


А не будет тут проблемы с тем что для регистрации используется конструктор Factory.
Код регистрируемых классов располагается в библиотеке (lib). И конструктор не вызывается, возможно это какая то оптимизация по неиспользуемым переменным?

те я просто это проверил добавив в класс статическую перменную, и инициализировав её в CPP(это всё в lib)..

#define IMPLEMENT_FACTORY(D, T) \
    Factory<##D, ##T> ##D::factory(#D); 

#endif
Re: Зарегистрировать класс в абстрактной фабрике
От: remark Россия http://www.1024cores.net/
Дата: 03.09.08 19:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Как сделать правильно? Т.е. есть некий модуль к примеру в котором хранится класс, cpp и h. Надо сделать так чтобы он сам при запуске программы зарегистрировался в фабрике..

А> Фабрику делаю не через шаблон а через прототип(те перегружный Clone в каждом объекте).
А> Возможно должен быть какой то статический вспомогательный объект чтоб у нег вызывался конструктор при старте. Но хз как и куда это вс подскажите плз


Тут:
http://gzip.rsdn.ru/forum/message/3089286.1.aspx
Автор: remark
Дата: 03.09.08




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Зарегистрировать класс в абстрактной фабрике
От: Анатолий Широков СССР  
Дата: 03.09.08 20:55
Оценка:
А>А не будет тут проблемы с тем что для регистрации используется конструктор Factory.
А>Код регистрируемых классов располагается в библиотеке (lib). И конструктор не вызывается, возможно это какая то оптимизация по неиспользуемым переменным?

А>те я просто это проверил добавив в класс статическую перменную, и инициализировав её в CPP(это всё в lib)..


А>
А>#define IMPLEMENT_FACTORY(D, T) \
А>    Factory<##D, ##T> ##D::factory(#D); 

А>#endif

А>


Немного ниже в этой же ветке: http://www.rsdn.ru/forum/message/132584.1.aspx
Автор: Анатолий Широков
Дата: 15.11.02
Re[4]: Зарегистрировать класс в абстрактной фабрике
От: Аноним  
Дата: 04.09.08 05:40
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>А не будет тут проблемы с тем что для регистрации используется конструктор Factory.

А>>Код регистрируемых классов располагается в библиотеке (lib). И конструктор не вызывается, возможно это какая то оптимизация по неиспользуемым переменным?

А>>те я просто это проверил добавив в класс статическую перменную, и инициализировав её в CPP(это всё в lib)..


А>>
А>>#define IMPLEMENT_FACTORY(D, T) \
А>>    Factory<##D, ##T> ##D::factory(#D); 

А>>#endif

А>>


АШ>Немного ниже в этой же ветке: http://www.rsdn.ru/forum/message/132584.1.aspx
Автор: Анатолий Широков
Дата: 15.11.02


Не помогло, конструктор не вызывается, компилятор MSVC 8. Я делал то же самое в рамкх одной программы без динковки и всё работало а так нет. Может в опциях компилятора чего поменять надо?
Re[5]: Зарегистрировать класс в абстрактной фабрике
От: Анатолий Широков СССР  
Дата: 04.09.08 06:19
Оценка:
А>Не помогло, конструктор не вызывается, компилятор MSVC 8. Я делал то же самое в рамкх одной программы без динковки и всё работало а так нет. Может в опциях компилятора чего поменять надо?

Вызов
ENSURE_CREATE(Der, Base)


должен находится в заголовочном файле, в котором определяется класс Der. В этом случае, статическая переменная factory_of_der будет помещена в каждую единицу трансляции, которая включает данный заголовочный файл. Следовательно конструктор этого объекта вызовется гарантированно.

Давайте разбираться, что происходит у Вас.
Re: Зарегистрировать класс в абстрактной фабрике
От: MasterZiv СССР  
Дата: 04.09.08 06:29
Оценка:
Аноним 540 wrote:

> Фабрику делаю не через шаблон а через прототип(те перегружный Clone в

> каждом объекте).
А зачем тогда вам вообще фабрика ? Фабрика нужна для
того, чтобы связать с именем класса статический метод создания
экземпляра. Если у вас уже есть виртуальный метод Clone, то
чтобы его вызвать, вам нужен уже существующий экземпляр создаваемого
класса и никакой фабрики вам уже не нужно — поиск нужного метода
выполнит виртуальная диспетчеризация.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Зарегистрировать класс в абстрактной фабрике
От: Аноним  
Дата: 04.09.08 07:24
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>Не помогло, конструктор не вызывается, компилятор MSVC 8. Я делал то же самое в рамкх одной программы без динковки и всё работало а так нет. Может в опциях компилятора чего поменять надо?


АШ>Вызов

АШ>
АШ>ENSURE_CREATE(Der, Base)
АШ>


АШ>должен находится в заголовочном файле, в котором определяется класс Der. В этом случае, статическая переменная factory_of_der будет помещена в каждую единицу трансляции, которая включает данный заголовочный файл. Следовательно конструктор этого объекта вызовется гарантированно.


АШ>Давайте разбираться, что происходит у Вас.


Да с заголовочным всё нормально. Спасибо. Я было примерно то же самое разместил в cpp.
Re[6]: Зарегистрировать класс в абстрактной фабрике
От: Аноним  
Дата: 04.09.08 07:33
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>Не помогло, конструктор не вызывается, компилятор MSVC 8. Я делал то же самое в рамкх одной программы без динковки и всё работало а так нет. Может в опциях компилятора чего поменять надо?


АШ>Вызов

АШ>
АШ>ENSURE_CREATE(Der, Base)
АШ>


АШ>должен находится в заголовочном файле, в котором определяется класс Der. В этом случае, статическая переменная factory_of_der будет помещена в каждую единицу трансляции, которая включает данный заголовочный файл. Следовательно конструктор этого объекта вызовется гарантированно.


АШ>Давайте разбираться, что происходит у Вас.

Да это работает(отвечал выше). Но дело в том, что полезней иметь возможность делать тоже самое именно в CPP, например для регистарции чего нибудь на вроде плагина, те класса хранящегося только в CPP. В случае если регистрацию проводить в заголовочном файле получается то мы должны обязательно инклудить их к клиентской программе.
Re[7]: Зарегистрировать класс в абстрактной фабрике
От: remark Россия http://www.1024cores.net/
Дата: 04.09.08 07:40
Оценка:
Здравствуйте, Аноним, Вы писали:

АШ>>Давайте разбираться, что происходит у Вас.

А>Да это работает(отвечал выше). Но дело в том, что полезней иметь возможность делать тоже самое именно в CPP, например для регистарции чего нибудь на вроде плагина, те класса хранящегося только в CPP. В случае если регистрацию проводить в заголовочном файле получается то мы должны обязательно инклудить их к клиентской программе.

Здесь:
http://gzip.rsdn.ru/forum/message/3089286.1.aspx
Автор: remark
Дата: 03.09.08

Конструктор класса может регистрировать плагин где-угодно. Никаких дополнительных макросов не нужно.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Зарегистрировать класс в абстрактной фабрике
От: Аноним  
Дата: 04.09.08 07:50
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Аноним 540 wrote:


>> Фабрику делаю не через шаблон а через прототип(те перегружный Clone в

>> каждом объекте).
MZ> А зачем тогда вам вообще фабрика ? Фабрика нужна для
MZ>того, чтобы связать с именем класса статический метод создания
MZ>экземпляра. Если у вас уже есть виртуальный метод Clone, то
MZ>чтобы его вызвать, вам нужен уже существующий экземпляр создаваемого
MZ>класса и никакой фабрики вам уже не нужно — поиск нужного метода
MZ>выполнит виртуальная диспетчеризация.

Ну я не силён в терминологии, фабрикой я называю всё то что создаёт объекты

если конкретно: Для создания объектов у меня есть класс который называется Registry, в нём есть map, который хранит экземпляры протототипов(тех в которых пеопределён Clone), ну и из этой мапы соответственно по имени через метод Clone я воспроизвожу объекты. Класс который хранит мапу я зову фабрикой Каких то особоых недостатков в такой реализации я не вижу.

Т.е. в чём суть того что вы написали? Я просто ошибся в терминологии или вы считаете что реализовано что-то не правильно/не оптимально?
Re[3]: Зарегистрировать класс в абстрактной фабрике
От: remark Россия http://www.1024cores.net/
Дата: 04.09.08 08:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну я не силён в терминологии, фабрикой я называю всё то что создаёт объекты


А>если конкретно: Для создания объектов у меня есть класс который называется Registry, в нём есть map, который хранит экземпляры протототипов(тех в которых пеопределён Clone), ну и из этой мапы соответственно по имени через метод Clone я воспроизвожу объекты. Класс который хранит мапу я зову фабрикой Каких то особоых недостатков в такой реализации я не вижу.


А>Т.е. в чём суть того что вы написали? Я просто ошибся в терминологии или вы считаете что реализовано что-то не правильно/не оптимально?


Да, нет, всё нормально
Это — фабрика на основе прототипов. Паттерн прототип описан у Фаулера в Шаблонах Корпоративных Приложений... или это было прямо в GOF... ну не не важно.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[8]: Зарегистрировать класс в абстрактной фабрике
От: Аноним  
Дата: 04.09.08 08:21
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Аноним, Вы писали:


АШ>>>Давайте разбираться, что происходит у Вас.

А>>Да это работает(отвечал выше). Но дело в том, что полезней иметь возможность делать тоже самое именно в CPP, например для регистарции чего нибудь на вроде плагина, те класса хранящегося только в CPP. В случае если регистрацию проводить в заголовочном файле получается то мы должны обязательно инклудить их к клиентской программе.

R>Здесь:

R>http://gzip.rsdn.ru/forum/message/3089286.1.aspx
Автор: remark
Дата: 03.09.08

R>Конструктор класса может регистрировать плагин где-угодно. Никаких дополнительных макросов не нужно.


Спасибо, метод попробую обязательно. Я уже видел это снизу, но вот чего-то зависимость от реализации компилятора смутила.
Re[3]: Зарегистрировать класс в абстрактной фабрике
От: MasterZiv СССР  
Дата: 04.09.08 13:06
Оценка:
Аноним 540 wrote:

> если конкретно: Для создания объектов у меня есть класс который

> называется Registry, в нём есть map, который хранит экземпляры
> протототипов(тех в которых пеопределён Clone),

Вот здорово ! А зачем вам тогда прототипы ?
Я думаю так: либо прототипы, либо — фабрика.
Потому что вместе это не имеет смысла.
Если у вас есть фабрика, то вам нет смысла хранить
там объекты, которые не будут использоваться,
а только будут идентифицировать методы.
Тогда уж лучше просто хранить методы создания
(статические, естественно). А если у вас есть экземпляры,
которые можно копировать, то вам не нужна уже фабрика —
потому что экземпляры у вас и так есть.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Зарегистрировать класс в абстрактной фабрике
От: MasterZiv СССР  
Дата: 04.09.08 13:09
Оценка:
remark wrote:

> Это — фабрика на основе прототипов. Паттерн прототип описан у Фаулера в

> Шаблонах Корпоративных Приложений... или это было прямо в GOF... ну не
> не важно.

Если это и паттерн, то какой-то совсем безумный.
В GoF такого точно нет (вот только что проверил).
В прототипе нет фабрик. В фабрике — прототипов.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Зарегистрировать класс в абстрактной фабрике
От: AstroMan  
Дата: 04.09.08 18:45
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Вот здорово ! А зачем вам тогда прототипы ?

MZ>Я думаю так: либо прототипы, либо — фабрика.
MZ>Потому что вместе это не имеет смысла.
MZ>Если у вас есть фабрика, то вам нет смысла хранить
MZ>там объекты, которые не будут использоваться,
MZ>а только будут идентифицировать методы.
MZ>Тогда уж лучше просто хранить методы создания
MZ>(статические, естественно). А если у вас есть экземпляры,
MZ>которые можно копировать, то вам не нужна уже фабрика -
MZ>потому что экземпляры у вас и так есть.

Комбинация может иметь смысл.
Можно некисло сэкономить на времени создания объектов и занимаемой ими
памяти, если используются счетчики ссылок и разделяемая реализация (а-ля cow).
Часто такие объекты не модифицируются и хранят состояние "по умолчанию".
Без прототипов нет вызова копирующего конструктора и, соответственно, нет разделения.
Re[4]: Зарегистрировать класс в абстрактной фабрике
От: Erop Россия  
Дата: 04.09.08 19:57
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Вот здорово ! А зачем вам тогда прототипы ?

MZ>Тогда уж лучше просто хранить методы создания
MZ>(статические, естественно). А если у вас есть экземпляры,
MZ>которые можно копировать, то вам не нужна уже фабрика -
MZ>потому что экземпляры у вас и так есть.

Ну, вообще-то разным именам может соответсвовать объект одного типа, но в разных состояниях...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Зарегистрировать класс в абстрактной фабрике
От: Erop Россия  
Дата: 04.09.08 20:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Как сделать правильно? Т.е. есть некий модуль к примеру в котором хранится класс, cpp и h. Надо сделать так чтобы он сам при запуске программы зарегистрировался в фабрике..

А> Фабрику делаю не через шаблон а через прототип(те перегружный Clone в каждом объекте).
А> Возможно должен быть какой то статический вспомогательный объект чтоб у нег вызывался конструктор при старте. Но хз как и куда это вс подскажите плз

IMHO, можно доработать напильником это
Автор: Erop
Дата: 26.04.08

Надо приделать к Registrar'у конструктор, от указателя на созданный по new прототип. И всё, по идее, получится просто и коротко...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Зарегистрировать класс в абстрактной фабрике
От: MasterZiv СССР  
Дата: 05.09.08 10:07
Оценка:
Erop wrote:

> Ну, вообще-то разным именам может соответсвовать объект одного типа, но

> в разных состояниях...
Вообще-то можно всё. Только ни в одном паттерне такого нет.
А чел. вроде бы как паттерн реализует.
Posted via RSDN NNTP Server 2.1 beta
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.