Как сделать правильно? Т.е. есть некий модуль к примеру в котором хранится класс, cpp и h. Надо сделать так чтобы он сам при запуске программы зарегистрировался в фабрике..
Фабрику делаю не через шаблон а через прототип(те перегружный Clone в каждом объекте).
Возможно должен быть какой то статический вспомогательный объект чтоб у нег вызывался конструктор при старте. Но хз как и куда это вс подскажите плз
Здравствуйте, Аноним, Вы писали:
А> Как сделать правильно? Т.е. есть некий модуль к примеру в котором хранится класс, cpp и h. Надо сделать так чтобы он сам при запуске программы зарегистрировался в фабрике.. А> Фабрику делаю не через шаблон а через прототип(те перегружный Clone в каждом объекте). А> Возможно должен быть какой то статический вспомогательный объект чтоб у нег вызывался конструктор при старте. Но хз как и куда это вс подскажите плз
Re[2]: Зарегистрировать класс в абстрактной фабрике
От:
Аноним
Дата:
03.09.08 13:36
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Здравствуйте, Аноним, Вы писали:
А>> Как сделать правильно? Т.е. есть некий модуль к примеру в котором хранится класс, cpp и h. Надо сделать так чтобы он сам при запуске программы зарегистрировался в фабрике.. А>> Фабрику делаю не через шаблон а через прототип(те перегружный Clone в каждом объекте). А>> Возможно должен быть какой то статический вспомогательный объект чтоб у нег вызывался конструктор при старте. Но хз как и куда это вс подскажите плз
АШ>В качестве примера: http://www.rsdn.ru/Forum/message/130926.1.aspx
А не будет тут проблемы с тем что для регистрации используется конструктор Factory.
Код регистрируемых классов располагается в библиотеке (lib). И конструктор не вызывается, возможно это какая то оптимизация по неиспользуемым переменным?
те я просто это проверил добавив в класс статическую перменную, и инициализировав её в CPP(это всё в lib)..
Здравствуйте, Аноним, Вы писали:
А> Как сделать правильно? Т.е. есть некий модуль к примеру в котором хранится класс, cpp и h. Надо сделать так чтобы он сам при запуске программы зарегистрировался в фабрике.. А> Фабрику делаю не через шаблон а через прототип(те перегружный Clone в каждом объекте). А> Возможно должен быть какой то статический вспомогательный объект чтоб у нег вызывался конструктор при старте. Но хз как и куда это вс подскажите плз
А>А не будет тут проблемы с тем что для регистрации используется конструктор Factory. А>Код регистрируемых классов располагается в библиотеке (lib). И конструктор не вызывается, возможно это какая то оптимизация по неиспользуемым переменным?
А>те я просто это проверил добавив в класс статическую перменную, и инициализировав её в CPP(это всё в lib)..
А>
Re[4]: Зарегистрировать класс в абстрактной фабрике
От:
Аноним
Дата:
04.09.08 05:40
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:
А>>А не будет тут проблемы с тем что для регистрации используется конструктор Factory. А>>Код регистрируемых классов располагается в библиотеке (lib). И конструктор не вызывается, возможно это какая то оптимизация по неиспользуемым переменным?
А>>те я просто это проверил добавив в класс статическую перменную, и инициализировав её в CPP(это всё в lib)..
А>>
Не помогло, конструктор не вызывается, компилятор MSVC 8. Я делал то же самое в рамкх одной программы без динковки и всё работало а так нет. Может в опциях компилятора чего поменять надо?
Re[5]: Зарегистрировать класс в абстрактной фабрике
А>Не помогло, конструктор не вызывается, компилятор MSVC 8. Я делал то же самое в рамкх одной программы без динковки и всё работало а так нет. Может в опциях компилятора чего поменять надо?
Вызов
ENSURE_CREATE(Der, Base)
должен находится в заголовочном файле, в котором определяется класс Der. В этом случае, статическая переменная factory_of_der будет помещена в каждую единицу трансляции, которая включает данный заголовочный файл. Следовательно конструктор этого объекта вызовется гарантированно.
Аноним 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]: Зарегистрировать класс в абстрактной фабрике
Здравствуйте, Аноним, Вы писали:
АШ>>Давайте разбираться, что происходит у Вас. А>Да это работает(отвечал выше). Но дело в том, что полезней иметь возможность делать тоже самое именно в CPP, например для регистарции чего нибудь на вроде плагина, те класса хранящегося только в CPP. В случае если регистрацию проводить в заголовочном файле получается то мы должны обязательно инклудить их к клиентской программе.
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]: Зарегистрировать класс в абстрактной фабрике
Здравствуйте, Аноним, Вы писали:
А>Ну я не силён в терминологии, фабрикой я называю всё то что создаёт объекты
А>если конкретно: Для создания объектов у меня есть класс который называется Registry, в нём есть map, который хранит экземпляры протототипов(тех в которых пеопределён Clone), ну и из этой мапы соответственно по имени через метод Clone я воспроизвожу объекты. Класс который хранит мапу я зову фабрикой Каких то особоых недостатков в такой реализации я не вижу.
А>Т.е. в чём суть того что вы написали? Я просто ошибся в терминологии или вы считаете что реализовано что-то не правильно/не оптимально?
Да, нет, всё нормально
Это — фабрика на основе прототипов. Паттерн прототип описан у Фаулера в Шаблонах Корпоративных Приложений... или это было прямо в GOF... ну не не важно.
Re[8]: Зарегистрировать класс в абстрактной фабрике
От:
Аноним
Дата:
04.09.08 08:21
Оценка:
Здравствуйте, remark, Вы писали:
R>Здравствуйте, Аноним, Вы писали:
АШ>>>Давайте разбираться, что происходит у Вас. А>>Да это работает(отвечал выше). Но дело в том, что полезней иметь возможность делать тоже самое именно в CPP, например для регистарции чего нибудь на вроде плагина, те класса хранящегося только в CPP. В случае если регистрацию проводить в заголовочном файле получается то мы должны обязательно инклудить их к клиентской программе.
R>Здесь: R>http://gzip.rsdn.ru/forum/message/3089286.1.aspx
Аноним 540 wrote:
> если конкретно: Для создания объектов у меня есть класс который > называется Registry, в нём есть map, который хранит экземпляры > протототипов(тех в которых пеопределён Clone),
Вот здорово ! А зачем вам тогда прототипы ?
Я думаю так: либо прототипы, либо — фабрика.
Потому что вместе это не имеет смысла.
Если у вас есть фабрика, то вам нет смысла хранить
там объекты, которые не будут использоваться,
а только будут идентифицировать методы.
Тогда уж лучше просто хранить методы создания
(статические, естественно). А если у вас есть экземпляры,
которые можно копировать, то вам не нужна уже фабрика —
потому что экземпляры у вас и так есть.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Зарегистрировать класс в абстрактной фабрике
remark wrote:
> Это — фабрика на основе прототипов. Паттерн прототип описан у Фаулера в > Шаблонах Корпоративных Приложений... или это было прямо в GOF... ну не > не важно.
Если это и паттерн, то какой-то совсем безумный.
В GoF такого точно нет (вот только что проверил).
В прототипе нет фабрик. В фабрике — прототипов.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Зарегистрировать класс в абстрактной фабрике
Здравствуйте, MasterZiv, Вы писали:
MZ>Вот здорово ! А зачем вам тогда прототипы ? MZ>Я думаю так: либо прототипы, либо — фабрика. MZ>Потому что вместе это не имеет смысла. MZ>Если у вас есть фабрика, то вам нет смысла хранить MZ>там объекты, которые не будут использоваться, MZ>а только будут идентифицировать методы. MZ>Тогда уж лучше просто хранить методы создания MZ>(статические, естественно). А если у вас есть экземпляры, MZ>которые можно копировать, то вам не нужна уже фабрика - MZ>потому что экземпляры у вас и так есть.
Комбинация может иметь смысл.
Можно некисло сэкономить на времени создания объектов и занимаемой ими
памяти, если используются счетчики ссылок и разделяемая реализация (а-ля cow).
Часто такие объекты не модифицируются и хранят состояние "по умолчанию".
Без прототипов нет вызова копирующего конструктора и, соответственно, нет разделения.
Re[4]: Зарегистрировать класс в абстрактной фабрике
Здравствуйте, MasterZiv, Вы писали:
MZ>Вот здорово ! А зачем вам тогда прототипы ? MZ>Тогда уж лучше просто хранить методы создания MZ>(статические, естественно). А если у вас есть экземпляры, MZ>которые можно копировать, то вам не нужна уже фабрика - MZ>потому что экземпляры у вас и так есть.
Ну, вообще-то разным именам может соответсвовать объект одного типа, но в разных состояниях...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Аноним, Вы писали:
А> Как сделать правильно? Т.е. есть некий модуль к примеру в котором хранится класс, cpp и h. Надо сделать так чтобы он сам при запуске программы зарегистрировался в фабрике.. А> Фабрику делаю не через шаблон а через прототип(те перегружный Clone в каждом объекте). А> Возможно должен быть какой то статический вспомогательный объект чтоб у нег вызывался конструктор при старте. Но хз как и куда это вс подскажите плз
Надо приделать к Registrar'у конструктор, от указателя на созданный по new прототип. И всё, по идее, получится просто и коротко...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Зарегистрировать класс в абстрактной фабрике
Erop wrote:
> Ну, вообще-то разным именам может соответсвовать объект одного типа, но > в разных состояниях...
Вообще-то можно всё. Только ни в одном паттерне такого нет.
А чел. вроде бы как паттерн реализует.