Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / фабрика / 25 сообщений из 40, страница 1 из 2
10.10.2006, 17:41
    #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
10.10.2006, 18:08
    #34045294
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
фабрика
Делается статическая файбрика, куда прописываются функции на создание и удаление объектов.
Посмотрите на этом форуме. Пару месяцев назад я этот вопрос задавал.
...
Рейтинг: 0 / 0
10.10.2006, 18:09
    #34045298
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
фабрика
тынц. У меня в качестве аргумента выступает строка.
...
Рейтинг: 0 / 0
11.10.2006, 07:35
    #34045946
JustVas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
фабрика
AkhДелается статическая файбрика, куда прописываются функции на создание и удаление объектов.
Посмотрите на этом форуме. Пару месяцев назад я этот вопрос задавал.
Хорошее решение - называется "полиморфные фабрики", только придется руками прописывать функции инициализации для каждого класса (см. первое письмо, код № 2). Как раз этого и хотелось бы избежать.
...
Рейтинг: 0 / 0
11.10.2006, 10:05
    #34046221
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
фабрика
М-да а кто кроме тебя может проинициализировать фабрику? По-моему ты хочешь странного.
...
Рейтинг: 0 / 0
11.10.2006, 10:20
    #34046282
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
фабрика
Это похоже на то, как я тогда бился головой об стенку, пытаясь найти средства как найти в программе нужные мне объекты. :)
...
Рейтинг: 0 / 0
11.10.2006, 10:21
    #34046289
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
фабрика
JustVas AkhДелается статическая файбрика, куда прописываются функции на создание и удаление объектов.
Посмотрите на этом форуме. Пару месяцев назад я этот вопрос задавал.
Хорошее решение - называется "полиморфные фабрики", только придется руками прописывать функции инициализации для каждого класса (см. первое письмо, код № 2). Как раз этого и хотелось бы избежать.

А чем вас не устраивают макросы от blinded?
...
Рейтинг: 0 / 0
11.10.2006, 11:39
    #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
11.10.2006, 11:52
    #34046632
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
фабрика
JustVasНарод! Покритикуйте, pls.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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