powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / фабрика
25 сообщений из 40, страница 1 из 2
фабрика
    #34045176
JustVas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли сделать фабрику, которая создает объекты без их перебора в switch’е
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Base* Factory::create(int type) {
switch type {
case  1 : return new Class1;
case  2 : return new Class2;
case  3 : return new Class3;
}
}
или без явной инициализации полиморфных фабрик
Код: plaintext
1.
2.
3.
Factory::factories[ 1 ] = new Class1::Factory;
Factory::factories[ 2 ] = new Class2::Factory;
Factory::factories[ 3 ] = new Class3::Factory;
(куски кода взяты из Эккеля).

Есть мысль сделать что-то такое (в зависимости от значения type срабатывет нужный инициализатор):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class Factory {
static vector<(*f)(int)> inits;
static create(int type) {
for(int i= 0 ; i<inits.size(); inits[i++]->init(type));
}
}

class Class1 {
static void init(int);
}

class Class2 {
static void init(int);
}
только вот не знаю, как инициализировать вектор Factory::ints

Может, есть решения получше? Намекните, где посмотреть.
...
Рейтинг: 0 / 0
фабрика
    #34045294
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делается статическая файбрика, куда прописываются функции на создание и удаление объектов.
Посмотрите на этом форуме. Пару месяцев назад я этот вопрос задавал.
...
Рейтинг: 0 / 0
фабрика
    #34045298
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тынц. У меня в качестве аргумента выступает строка.
...
Рейтинг: 0 / 0
фабрика
    #34045946
JustVas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkhДелается статическая файбрика, куда прописываются функции на создание и удаление объектов.
Посмотрите на этом форуме. Пару месяцев назад я этот вопрос задавал.
Хорошее решение - называется "полиморфные фабрики", только придется руками прописывать функции инициализации для каждого класса (см. первое письмо, код № 2). Как раз этого и хотелось бы избежать.
...
Рейтинг: 0 / 0
фабрика
    #34046221
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М-да а кто кроме тебя может проинициализировать фабрику? По-моему ты хочешь странного.
...
Рейтинг: 0 / 0
фабрика
    #34046282
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это похоже на то, как я тогда бился головой об стенку, пытаясь найти средства как найти в программе нужные мне объекты. :)
...
Рейтинг: 0 / 0
фабрика
    #34046289
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustVas AkhДелается статическая файбрика, куда прописываются функции на создание и удаление объектов.
Посмотрите на этом форуме. Пару месяцев назад я этот вопрос задавал.
Хорошее решение - называется "полиморфные фабрики", только придется руками прописывать функции инициализации для каждого класса (см. первое письмо, код № 2). Как раз этого и хотелось бы избежать.

А чем вас не устраивают макросы от blinded?
...
Рейтинг: 0 / 0
фабрика
    #34046571
JustVas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
#include <iostream>
#include <vector>

using namespace std;

class Factory {
public:
	static vector<void (*)(int)> inits;
	static void create(int type) {
		for(unsigned i =  0 ; i < inits.size(); (*inits[i++])(type));
	}
};

vector<void (*)(int)> Factory::inits;

class Class1 {
public:
	static void init(int type) {
		if (type ==  1 )
			cout<<"Class1 init"<<endl;
	};
	class Int1;
	friend class Int1;
	class Int1 {
	public:
		Int1() {
			cout<<"Int1"<<endl;
			Factory::inits.push_back(init);
			cout<<Factory::inits.size()<<endl;
		}
	};
	static Int1 int1;
};

Class1::Int1 Class1::int1;

class Class2 {
public:
	static void init(int type) {
		if (type ==  2 )
			cout<<"Class2 init"<<endl;
	};
	class Int2;
	friend class Int2;
	class Int2 {
	public:
		Int2() {
			cout<<"Int2"<<endl;
			Factory::inits.push_back(init);
			cout<<Factory::inits.size()<<endl;
		}
	};
	static Int2 int2;
};

Class2::Int2 Class2::int2;

int main(int argc, char *argv[])
{
	Factory::create( 1 );
	Factory::create( 2 );
	char c;
	cin>>c;
	return  0 ;
}
Главное, не нарушить порядок инициализации: Factory::inits идет первым. Вроде, работает... Народ! Покритикуйте, pls.
...
Рейтинг: 0 / 0
фабрика
    #34046632
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustVasНарод! Покритикуйте, pls.

тот же самый закат солнца в ручную (классы Int1, Int2).
Минусы:
- Инентификация класса по типу возложена на класс, а не на фабрику
- Создание/инициализация объекта возложена на сам объект, а не на объект инициализации фабрики
...
Рейтинг: 0 / 0
фабрика
    #34046656
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У самого вопрос возник. Как говорит стандарт о том, есть ли установленный порядок инициализации указателей и создании классов? Т.е. есть гарантия, что
Код: plaintext
A *a=NULL;
сработает раньше чем
Код: plaintext
A b;
?
...
Рейтинг: 0 / 0
фабрика
    #34046693
JustVas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh JustVasНарод! Покритикуйте, pls.

тот же самый закат солнца в ручную (классы Int1, Int2).
Минусы:
- Инентификация класса по типу возложена на класс, а не на фабрику
Иначе получится один большой switch, от которого и стараюсь избавиться. В этом же решении создание нового класса не ведет к необходимости изменения фабрики
Akh- Создание/инициализация объекта возложена на сам объект, а не на объект инициализации фабрики
Это хорошо, т.к. вызов нужного конструктора, чтение/запись и другие специфичные для класса действия лучше доверить самому классу
...
Рейтинг: 0 / 0
фабрика
    #34046716
JustVas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkhУ самого вопрос возник. Как говорит стандарт о том, есть ли установленный порядок инициализации указателей и создании классов? Т.е. есть гарантия, что
Код: plaintext
A *a=NULL;
сработает раньше чем
Код: plaintext
A b;
?
В единице трансляции инициализация идет в той последовательности, как пишется. Правда, потом компоновщик может все перековеркать в зависимости от того, в какой последовательности стоят *.obj (хотя на этот момент стандарт ничего не говорит)
...
Рейтинг: 0 / 0
фабрика
    #34046733
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustVas Akh JustVasНарод! Покритикуйте, pls.

тот же самый закат солнца в ручную (классы Int1, Int2).
Минусы:
- Инентификация класса по типу возложена на класс, а не на фабрику
Иначе получится один большой switch, от которого и стараюсь избавиться. В этом же решении создание нового класса не ведет к необходимости изменения фабрики
Akh- Создание/инициализация объекта возложена на сам объект, а не на объект инициализации фабрики
Это хорошо, т.к. вызов нужного конструктора, чтение/запись и другие специфичные для класса действия лучше доверить самому классу

1. Фабрике можно передавать тип, она в вектор будет загонять структуру с типом и функцией инициализации. Потом поиском будет искать. Фабрику не надо будет изменять, свича не будет.
2. На счет вызова нужного конструктора, думаю, это должна делать сама фабрика по типу.
3. На счет чтения записи, не совсем понял про что вы, но этими делами должен заниматься сам конструктор.

Т.е. Волки отдельно, овцы отдельно. Созданием объекта, объект заниматься не должен, этим должна заниматься фабрика с помощью дополнительного объекта. Инициализацияей себя, объект должен заниматься сам, т.к. это его дело, а не всякие посторонние объекты; он лучше знает, что ему делать.
...
Рейтинг: 0 / 0
фабрика
    #34046784
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustVas AkhУ самого вопрос возник. Как говорит стандарт о том, есть ли установленный порядок инициализации указателей и создании классов? Т.е. есть гарантия, что
Код: plaintext
A *a=NULL;
сработает раньше чем
Код: plaintext
A b;
?
В единице трансляции инициализация идет в той последовательности, как пишется. Правда, потом компоновщик может все перековеркать в зависимости от того, в какой последовательности стоят *.obj (хотя на этот момент стандарт ничего не говорит)

Если нет четкого ограничения, то плохо. Если бы было так, как я сказал, то создание вектора при первом запуске установке функции инициализации решало бы проблему с синхронизацией создание_списка-добавление_в_список.

Да, кстати, глобальный A *a=NULL, по моему, инициализируется еще до запуска исполнияемого файла, т.к. уже лежит в нем. Так было в ассемблере, так, наверное, и в сях. Так что это еще вам один минус. ;)
...
Рейтинг: 0 / 0
фабрика
    #34046817
JustVas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh
1. Фабрике можно передавать тип, она в вектор будет загонять структуру с типом и функцией инициализации. Потом поиском будет искать. Фабрику не надо будет изменять, свича не будет.
2. На счет вызова нужного конструктора, думаю, это должна делать сама фабрика по типу.
3. На счет чтения записи, не совсем понял про что вы, но этими делами должен заниматься сам конструктор.

Т.е. Волки отдельно, овцы отдельно. Созданием объекта, объект заниматься не должен, этим должна заниматься фабрика с помощью дополнительного объекта. Инициализацияей себя, объект должен заниматься сам, т.к. это его дело, а не всякие посторонние объекты; он лучше знает, что ему делать.
Возникает чувство, что мы слегка друг друга не понимаем. Я говорю не про классическую "голую" фабрику, а про "полиморфную". В ней каждый класс имеет свою "минифабрику", адрес которой записывается в "головной" фабрике. Задача "головной" фабрики - вызвать нужную "мини". Все это в "БандеЧетырех" есть, вот только не нравится, что инициализация массива "головной" фабрики вручную делается
...
Рейтинг: 0 / 0
фабрика
    #34046854
JustVas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkhДа, кстати, глобальный A *a=NULL, по моему, инициализируется еще до запуска исполнияемого файла, т.к. уже лежит в нем. Так было в ассемблере, так, наверное, и в сях. Так что это еще вам один минус. ;)
Так и есть. А что в этом плохого?
...
Рейтинг: 0 / 0
фабрика
    #34046866
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustVasВозникает чувство, что мы слегка друг друга не понимаем. Я говорю не про классическую "голую" фабрику, а про "полиморфную". В ней каждый класс имеет свою "минифабрику", адрес которой записывается в "головной" фабрике. Задача "головной" фабрики - вызвать нужную "мини". Все это в "БандеЧетырех" есть, вот только не нравится, что инициализация массива "головной" фабрики вручную делается

Большой звиняй тогда. А я то все думаю, что за полиморфность...

Может стоит попробовать реализовать фабрики классов внутри головной фабрики, путем использования в головной вектор векторов?
...
Рейтинг: 0 / 0
фабрика
    #34046882
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustVas AkhДа, кстати, глобальный A *a=NULL, по моему, инициализируется еще до запуска исполнияемого файла, т.к. уже лежит в нем. Так было в ассемблере, так, наверное, и в сях. Так что это еще вам один минус. ;)
Так и есть. А что в этом плохого?

Тогда надо делать головной вектор динамически, при первом вызове функции добавления в фабрику. Не будет проблем с тем, что бы он создавался первым.
...
Рейтинг: 0 / 0
фабрика
    #34046910
Тогда надо делать головной вектор динамически, при первом вызове функции добавления в фабрику. Не будет проблем с тем, что бы он создавался первым.

Мейерс предлагал локальный статический объект в функции, возвращающей на него ссылку
...
Рейтинг: 0 / 0
фабрика
    #34046935
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир Тогда надо делать головной вектор динамически, при первом вызове функции добавления в фабрику. Не будет проблем с тем, что бы он создавался первым.

Мейерс предлагал локальный статический объект в функции, возвращающей на него ссылку

Хитро. Придумают же! :)
...
Рейтинг: 0 / 0
фабрика
    #34046940
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир Тогда надо делать головной вектор динамически, при первом вызове функции добавления в фабрику. Не будет проблем с тем, что бы он создавался первым.

Мейерс предлагал локальный статический объект в функции, возвращающей на него ссылку

Стоп! А нафиг, если этот вектор все равно в классе?
...
Рейтинг: 0 / 0
фабрика
    #34047112
Стоп! А нафиг, если этот вектор все равно в классе?

это просто техника решения проблем порядка инициализации статических нелокальных объектов, каковым представляется фабрика
...
Рейтинг: 0 / 0
фабрика
    #34047147
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир Стоп! А нафиг, если этот вектор все равно в классе?

это просто техника решения проблем порядка инициализации статических нелокальных объектов, каковым представляется фабрика

В моем варианте указатель на вектор содержится в фабрике, у Мейерса, я так понимаю, он содержится в дополнительном локальном классе. Какие здесь плюсы?
...
Рейтинг: 0 / 0
фабрика
    #34047211
В моем варианте указатель на вектор содержится в фабрике, у Мейерса, я так понимаю, он содержится в дополнительном локальном классе. Какие здесь плюсы?

чо-то я Вас запутал..

есть фабрика - глобальный объект некого класса, синглтон если желаете
внутри у него м.б. вектор или мэп, не суть
у него есть интерфейс: зарегистрировать функцию создания объекта некого класса и создать объект из ранее зарегистрированных типов

ну собственно и вылезает проблема инициализации фабрики перед первым ее использованием, которая решается как я написал

если я что недопонял, извините ;)
...
Рейтинг: 0 / 0
фабрика
    #34047278
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимирчо-то я Вас запутал..

Да похоже на то. Фабрику я тоже такую же имел ввиду. Можно разжевать следующее?: ;)

Мейерс предлагал локальный статический объект [чего?] в функции [какой?], возвращающей на него [кого?] ссылку.

А то у меня несколько вариантов (про инициализацию вектора, запуск функции и, [о, боже!] способ добавления в фабрику) и пытаясь куда-то это присобачить, крыша едет. :)
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / фабрика
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]