powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / фабрика
15 сообщений из 40, страница 2 из 2
фабрика
    #34047541
модифицированный пример простой фабрики из Александреску:

Код: 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.
class CFactory
{
private:

	CFactory(){}

public:

	static CFactory &Instance()
	{
		static CFactory _instance;
		return _instance;
	}

public:

	typedef void* (*CreateCallback)();

private:

	typedef std::map< int, CreateCallback > CallBackMap;
	CallBackMap m_callbacks;

public:

	bool Register( int id, CreateCallback createFn )
	{
		return m_callbacks.insert( CallBackMap::value_type( id, createFn ) ).second;
	}

};


в модулях конкретных классов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class Line{};

void* CreateLine()
{
	return new Line();
}
const int LINE =  1 ;
const bool registered = CFactory::Instance().Register( LINE, Create );

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


А гарантия, что конструктор m_callbacks вызовется до m_callbacks.insert?
...
Рейтинг: 0 / 0
фабрика
    #34047747
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дельфях можно что-то подобное:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 type 
  TBaseClass =  class   end ;
  TClass1 =  class (TBaseClass)  end ;
  TClass2 =  class (TBaseClass)  end ;
  TClass3 =  class (TBaseClass)  end ;

  TBaseClassType =  class   of  TBaseClass;
 const 
  BaseClassArray :  array [ 0 .. 3 ]  of  TBaseClassType =(TBaseClass, TClass1, TClass2, TClass3);

 function  StaticFabric(index : integer) : TBaseClass;
 begin 
   //тут проверки на валидность аргумента 
  result := BaseClassArray[index].Create;
 end ;

Кто знает, можно ли в C++ сделать подобное?
...
Рейтинг: 0 / 0
фабрика
    #34047775
А гарантия, что конструктор m_callbacks вызовется до m_callbacks.insert?

"мамой клянусь" :)

на момент вызова метода объект CFactory уже создан и инициализорован, ровно как все его подобъекты, разве нет?
...
Рейтинг: 0 / 0
фабрика
    #34047867
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир А гарантия, что конструктор m_callbacks вызовется до m_callbacks.insert?

"мамой клянусь" :)

на момент вызова метода объект CFactory уже создан и инициализорован, ровно как все его подобъекты, разве нет?

_instance является локальным объектом, создается который при входе в метод, но он является еще и статическим, значит создаваться он при входе не будет. А будет, значит, он создаватья когда и другие глобальные объекты. Создаваться это у нас - выделение памяти и вызов конструктора.
Также, registered глобальный - выделение памяти и вызов функции.
Получается, что они равноправны.

Так я думаю.

ПС: И все таки скребут кошки на счет статика в статике...
...
Рейтинг: 0 / 0
фабрика
    #34047877
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимирмодифицированный пример простой фабрики из Александреску:
А где CFactory::Create (как нужный объект получить)?
...
Рейтинг: 0 / 0
фабрика
    #34047900
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ikВ дельфях можно что-то подобное:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 type 
  TBaseClass =  class   end ;
  TClass1 =  class (TBaseClass)  end ;
  TClass2 =  class (TBaseClass)  end ;
  TClass3 =  class (TBaseClass)  end ;

  TBaseClassType =  class   of  TBaseClass;
 const 
  BaseClassArray :  array [ 0 .. 3 ]  of  TBaseClassType =(TBaseClass, TClass1, TClass2, TClass3);

 function  StaticFabric(index : integer) : TBaseClass;
 begin 
   //тут проверки на валидность аргумента 
  result := BaseClassArray[index].Create;
 end ;

Кто знает, можно ли в C++ сделать подобное?

Нарпимер, изменив массив на массив функций создания класса.
...
Рейтинг: 0 / 0
фабрика
    #34047905
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ikВ дельфях можно что-то подобное:

....

Кто знает, можно ли в C++ сделать подобное?
Нельзя - "class of " нету.
...
Рейтинг: 0 / 0
фабрика
    #34047913
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone Голенков Владимирмодифицированный пример простой фабрики из Александреску:
А где CFactory::Create (как нужный объект получить)?

В мапе ищещь, отдаешь.
...
Рейтинг: 0 / 0
фабрика
    #34047933
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhНарпимер, изменив массив на массив функций создания класса.Ну так-то конечно. Только эти функции еще написать надо.
...
Рейтинг: 0 / 0
фабрика
    #34048071
_instance является локальным объектом, создается который при входе в метод, но он является еще и статическим, значит создаваться он при входе не будет.

"Конструктор локального статического объекта вызывается один раз при первом выполнении инструкции, содержащей определение объекта."

Страуструп, C++ 3е издание, [10.4.8]

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

Мейерс, Эффективное использование C++ 3е издание
...
Рейтинг: 0 / 0
фабрика
    #34048172
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир _instance является локальным объектом, создается который при входе в метод, но он является еще и статическим, значит создаваться он при входе не будет.

"Конструктор локального статического объекта вызывается один раз при первом выполнении инструкции, содержащей определение объекта."

Страуструп, C++ 3е издание, [10.4.8]

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

Мейерс, Эффективное использование C++ 3е издание

Да, признаю. Много в С++ оговорок, которые логически трудно/невозможно вывести.

ПС: Подход очень хороший.
...
Рейтинг: 0 / 0
фабрика
    #34049386
в приведенном мной примере функция CFactory::Instance() не должна быть inline
...
Рейтинг: 0 / 0
фабрика
    #34050002
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно тут "крупному" специалисту встрять?
Что касается полиморфной фабрики жестко связянной с некоторой иерархией классов, как того хотел автор топика. мне кажется это не совсем правильным
1) иногда бывает необходимо производить обекты классов не всего дерева насладования, а только его поддерева
2) и это у меня очень часто бывало за разными значениями ключа кроется одинаковые производящие функции Например OCI от oracle 8 закрывали, ну возвращает мне из описания таблицы отн тип данных char, varchar2 или другой символьный тип а в С++ все равно char[] заводить
Ну а что касается представленной фабрики не вижу никаких преимуществ перед совместным с Akh'ом творением
...
Рейтинг: 0 / 0
фабрика
    #34050090
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedМожно тут "крупному" специалисту встрять?
Что касается полиморфной фабрики жестко связянной с некоторой иерархией классов, как того хотел автор топика. мне кажется это не совсем правильным
1) иногда бывает необходимо производить обекты классов не всего дерева насладования, а только его поддерева
2) и это у меня очень часто бывало за разными значениями ключа кроется одинаковые производящие функции Например OCI от oracle 8 закрывали, ну возвращает мне из описания таблицы отн тип данных char, varchar2 или другой символьный тип а в С++ все равно char[] заводить
Ну а что касается представленной фабрики не вижу никаких преимуществ перед совместным с Akh'ом творением

Я вижу преимущество в гарантии инициализации всех данных фабрики в момент первой записи информации о классе.

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


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